2013-03-03 67 views
6

我有一个静态库libmylib,依赖于数学库。CMake:使用gcc正确链接系统库

如果我第一个链接mylib中的数学,然后到我的可执行程序,它的工作原理:

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

但是,如果我做了与它直接使用gcc失败时可执行文件链接

(铿锵它的作品!)
add_executable(myapp main.c) 
target_link_libraries(myapp m mylib) 

为什么这有什么区别?
我认为无论如何不可能将库链接在一起?

回答

6

当使用cmake的target_link_libraries这并不意味着你会链接任何东西。它会在targetlibrary类型/动作link之间创建依赖关系。

我想,第一个例子中的实际建立行会导致这样的事情:

gcc -o myapp myapp.o -lmylib -lm 

,第二个

gcc -o myapp myapp.o -lm -lmylib 

。如果mylib引用m第二个示例(可能)不链接。

尝试运行make VERBOSE=1并研究链接过程的命令行以真正理解发生了什么。 clang的链接器可能是智能的,并且在链接过程中实际放置库之前等待所有的调用被链接。

+0

我认为你是对的 - gcc似乎在链接期间放弃库,如果它们没有在二进制之后提供。 如果我将命令更改为'target_link_libraries(myapp mylib m)',它可以工作! – mirkokiefer 2013-03-03 14:16:54

+0

您是否在clang中使用make VERBOSE = 1? – 2013-03-03 18:11:06

+0

是的,我试了一下 - 看到我的答案。谢谢你的帮助! – mirkokiefer 2013-03-03 20:05:20

0

使用target_link_libraries时,指定链接库的顺序很重要。而这个工程

target_link_libraries(myapp m mylib) 

这不会(至少在v4.6.3)使用gcc时工作

target_link_libraries(myapp mylib m) 

所以mylib中所依赖的所有库有后前来MYLIB。

如果用make VERBOSE=1追查实际的链接器调用,你会发现本作中碎例如:

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

,这为工作之一:具有完全相同的

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

调用铛参数在两种情况下都适用!

所以@PatrickB似乎是正确的:

铛的接头,也许是聪明的,并等待所有来电被 在链接过程实际上丢弃库之前链接。

+0

您应该将@Patrick B.的答案标记为正确,然后:-) – Fraser 2013-03-04 22:23:57