首页 > 解决方案 > target_link_libraries(libstatic libfoo libbar) 会发生什么?

问题描述

当我们的目标是静态库时,我对链接库有点困惑。

例如,对于可执行文件,它将帮助链接器解析未定义的符号。但是,如果是静态库,为什么要在这个阶段链接?

当我链接some executable反对时,链接不会完成libstatic吗?

谢谢。

标签: cmakelinker

解决方案


在 CMake 中,

target_link_libraries(targetName PUBLIC lib1 lib2)

在两种情况下影响链接器的参数:

  1. PRIVATE:当为可执行文件/库调用链接器时,对应于 target targetName
  2. INTERFACE:当为其他可执行文件/库调用链接器时,该链接器otherTargetNametargetNamevia链接

    target_link_libraries(otherTargetName PUBLIC targetName)
    

    这被称为链接库的传递属性。

您是对的,没有为静态库调用链接器,因此在这种情况下,第一种情况被消除了。

但是第二种情况仍然存在:当您创建可执行文件(或其他共享库)并调用

target_link_libraries(otherTargetName PUBLIC libStatic)

然后 CMake 会自动将该可执行文件(或共享库)与所有内容链接,这些libStatic内容与target_link_libraries.


这种自动化有助于构建项目:

  1. 通过调用

    target_link_libraries(libStatic PUBLIC lib1 lib2)
    

    你说,它libStatic使用定义的函数lib1lib2

  2. 通过调用

    target_link_libraries(otherTargetName PUBLIC libStatic)
    

    您说,该可执行文件/库otherTargetName使用来自libStatic.

    在这个阶段,你不关心 的内部结构libStatic,无论它是独立的还是依赖于其他一些库:CMake 会为你关心这个。


使用PUBLIC关键字 in 的注意事项target_link_libraries:虽然在某些情况下这相当于省略关键字,但现代 CMake 方法是显式指定关键字。另见政策 CMP0023

其他可能的关键字是PRIVATEand INTERFACE,它们中的每一个都只选择上面描述的一个场景。


请注意,传递链接属性是纯 CMake 功能,仅在链接到目标时才有效。库文件 (.a.lib) 本身不包含有关依赖库的信息,因此与文件的链接不会触发传递链接。


推荐阅读