An odd little one: I was compiling some older code on gcc 4.6 / Ubuntu 11.10 and it failed to make, with the traditional error:
undefined reference to `sqrt'
My Makefile was trying to do something like this:
gcc -c -o eg.o eg.c gcc -lm -o eg eg.o
… yep, there’s
-lm so what’s the problem?
It turns out that gcc 4.6 has become fussier about the order of its options now, and wants the libs on the end when linking, like this:
gcc -c -o eg.o eg.c gcc -o eg eg.o -lm
This will catch you out if you set up your Makefile like this:
Because the libs always appear up front. Instead, put the libs on the end where they belong by doing this in the Makefile:
If you’re still having trouble with the order of libraries, it might help to add this as well:
Which will pass the
--no-as-needed flag to
ld, to relax the
constraints on the order which things are evaluated by the linker, or