我有一个依赖于数学库的静态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)
为什么这会有所不同?
我认为无论如何都不可能将库链接在一起?
答案 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的链接器可能是智能的,等待所有的调用 在链接过程中实际删除库之前已链接。