6

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

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

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)

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

4

2 回答 2

6

使用 cmaketarget_link_libraries并不意味着你会链接任何东西。target它会在 a和 alibrary的 type/action之间创建依赖关系link

我猜第一个示例的实际构建行将导致类似的结果:

gcc -o myapp myapp.o -lmylib -lm

第二个

gcc -o myapp myapp.o -lm -lmylib

. 如果mylib引用m了第二个示例(可能)没有链接。

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

于 2013-03-03T10:48:06.183 回答
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 的链接器可能是智能的,并且在链接过程中实际删除库之前等待所有调用被链接。

于 2013-03-03T20:03:44.937 回答