【问题标题】:Which library does `Cmake` prefer to link to when invoking `target_link_libraries(target_name, library_name_without_postfix)`?调用 `target_link_libraries(target_name, library_name_without_postfix)` 时,`Cmake` 更喜欢链接到哪个库?
【发布时间】: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 我明白了,非常感谢。

标签: linux ubuntu cmake build linker


【解决方案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 抱歉,我无法展示该项目。这是不允许的。
猜你喜欢
  • 2011-07-20
  • 2019-03-09
  • 2023-04-04
  • 2015-08-16
  • 2022-12-04
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多