调用 `target_link_libraries(target_name, library_name_without_postfix)` 时,`Cmake` 更喜欢链接到哪个库?

Posted

技术标签:

【中文标题】调用 `target_link_libraries(target_name, library_name_without_postfix)` 时,`Cmake` 更喜欢链接到哪个库?【英文标题】:Which library does `Cmake` prefer to link to when invoking `target_link_libraries(target_name, library_name_without_postfix)`? 【发布时间】:2021-08-29 16:04:14 【问题描述】:

特定库的静态版本和共享版本都在同一个文件夹中,那么Cmake 在调用target_link_libraries(target_name, library_name_without_postfix) 时更喜欢链接到哪个库?

为什么?

【问题讨论】:

这取决于您的链接器,但可能是共享的。如果您输入库文件的名称(而不是 CMake 库目标),CMake 只会在链接器行上传递 -llibrary_name_without_postfix 如果没有指定,则默认为共享。 @Bhai 有参考吗? @John gcc.gnu.org/onlinedocs/gcc/Link-Options.html 如果同时找到静态库和共享库,则链接器会优先链接共享库,除非使用了 -static 选项。 @Bhai 我明白了,非常感谢。 【参考方案1】:

如果 target_link_libraries 在第二个参数中使用库名称,它完全取决于链接器。在您的情况下,链接行将被翻译为

-llibrary_name_without_postfix.

在这种情况下,它将在标准路径(如 LD_LIBRARY_PATH、/etc/ld.so.conf)或系统路径中进行搜索。

由于您没有说明位置,我假设库位于当前构建目录中。并且您在某处有一个命令,包括使用link_directories 的链接器路径中的当前构建目录。在这种情况下,默认链接是动态的。

【讨论】:

感谢您的澄清。上述库是与二进制程序一起构建的目标之一。奇怪的是,CMakeLists.txt 确实没有link_directoriestarget_link_libraries(binary_program_name, lib_name) 仍然可以找到共享库的正确路径。 @John 尝试找到构建库的 add_library 命令。这应该类似于add_library(lib_name [optional STATIC or SHARED] list_of_files)。如果没有明确提到 STATIC,那么它就是动态的。 当您将目标名称传递给target_link_libraries 时,CMake 会自动设置link_directories @arrowd 有任何验证参考吗? link_directories 获取目录,target_link_libraries 获取名称、目标或链接标志。这些都不能很好地转换为目录。 @Bhai 抱歉,我无法展示该项目。这是不允许的。

以上是关于调用 `target_link_libraries(target_name, library_name_without_postfix)` 时,`Cmake` 更喜欢链接到哪个库?的主要内容,如果未能解决你的问题,请参考以下文章

CMake中target_link_libraries的使用

C++学习(四一零)cmake的target_link_libraries

库目标的 target_link_libraries PRIVATE 语义

当目标是静态库而目标链接是静态库时,target_link_libraries 会做啥

cmake中target_link_libraries()使用问题动态库使用绝对路径没问题,但是使用相对路径就矬了?

在CMake中如何使`TARGET_LINK_LIBRARIES'禁止第三方库代码发出警告?