调用 `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_directories
,target_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 会做啥