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

mir*_*fer 6 gcc cmake clang

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

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

add_executable(myapp main.c)
target_link_libraries(mylib m)
target_link_libraries(myapp mylib)
Run Code Online (Sandbox Code Playgroud)

但是,如果我直接使用可执行文件进行链接,则在使用gcc时会失败(使用clang可以正常工作!)

add_executable(myapp main.c)
target_link_libraries(myapp m mylib)
Run Code Online (Sandbox Code Playgroud)

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

Pat*_* B. 6

使用cmake target_link_libraries时,并不意味着你会链接任何东西.它宁可在a target和a library类型/动作之间创建依赖关系link.

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

gcc -o myapp myapp.o -lmylib -lm
Run Code Online (Sandbox Code Playgroud)

第二个

gcc -o myapp myapp.o -lm -lmylib
Run Code Online (Sandbox Code Playgroud)

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

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