mirkokiefer
mirkokiefer

Reputation: 3537

CMake: correctly linking system library using gcc

I have a static libary mylib that depends on the math library.

If I first link mylib with math and then to my executable it works:

add_executable(myapp main.c)
target_link_libraries(mylib m)
target_link_libraries(myapp mylib)

But if I do the linking directly with the executable it fails when using gcc (with clang it works!)

add_executable(myapp main.c)
target_link_libraries(myapp m mylib)

Why does this make any difference?
I thought that it is anyway not possible to link libraries together?

Upvotes: 6

Views: 11931

Answers (2)

mirkokiefer
mirkokiefer

Reputation: 3537

When using target_link_libraries it matters in which order you specify linked libraries.

This does not work when using gcc (at least in v4.6.3):

target_link_libraries(myapp m mylib)

while this works:

target_link_libraries(myapp mylib m)

So all libraries mylib depends on have to come after mylib.

If you track down the actual linker invocation with make VERBOSE=1 you will find this for the broken example:

gcc main.c.o  -o luatest -rdynamic -lm mylib.a

and this for the working one:

gcc main.c.o  -o luatest -rdynamic mylib.a -lm

Invoking clang with the exact same parameters works in both cases!

So @PatrickB seems to be right:

The linker of clang is maybe intelligent and waits for all calls to be linked before actually dropping a library during the link-process.

Upvotes: 0

Patrick B.
Patrick B.

Reputation: 12373

When using cmake's target_link_libraries it does not mean you will link anything. It rather will create a dependency between a target and a library of type/action link.

I guess that the actually build line of the first example will result in something like that:

gcc -o myapp myapp.o -lmylib -lm

and the second one

gcc -o myapp myapp.o -lm -lmylib

. If mylib has references to m the second example (might) not link.

Try to run make VERBOSE=1 and study the command-line of the link-process to really understand what's happening. The linker of clang is maybe intelligent and waits for all calls to be linked before actually dropping a library during the link-process.

Upvotes: 6

Related Questions