CMake:使用gcc正确链接系统库

时间:2013-03-03 02:44:38

标签: gcc cmake clang

我有一个依赖于数学库的静态libary mylib。

如果我首先将mylib与math连接,然后连接到我的可执行文件,它可以工作:

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

但是,如果我直接使用可执行文件进行链接,那么在使用gcc时会失败(使用clang就可以了!)

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

为什么这会有所不同?
我认为无论如何都不可能将库链接在一起?

2 个答案:

答案 0 :(得分:6)

使用cmake的target_link_libraries时,并不意味着您会链接任何内容。它宁可在类型/操作target的{​​{1}}和library之间创建依赖关系。

我猜第一个例子的实际构建行会产生类似的结果:

link

和第二个

gcc -o myapp myapp.o -lmylib -lm

。如果gcc -o myapp myapp.o -lm -lmylib 引用mylib,则第二个示例(可能)不会链接。

尝试运行m并研究链接过程的命令行,以真正了解正在发生的事情。 clang的链接器可能是智能的,并且在链接过程中实际删除库之前等待所有调用被链接。

答案 1 :(得分:0)

使用target_link_libraries时,您指定链接库的顺序很重要。

使用gcc时这不起作用(至少在v4.6.3中):

target_link_libraries(myapp m mylib)

虽然这有效:

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

在两种情况下都可以使用完全相同的参数调用clang!

所以@PatrickB似乎是对的:

  

clang的链接器可能是智能的,等待所有的调用   在链接过程中实际删除库之前已链接。