target_link_libraries(libstatic libfoo libbar)会发生什么?

时间:2019-07-16 21:37:00

标签: cmake linker

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

例如,对于可执行文件,它将帮助链接程序解析未定义的符号。但是,在使用静态库的情况下,为什么要在此阶段链接?

当我将some executable链接到libstatic时是否会链接?

谢谢。

1 个答案:

答案 0 :(得分:2)

在CMake中,

target_link_libraries(targetName PUBLIC lib1 lib2)

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

  1. PRIVATE :为可执行文件/库调用链接器时,对应于目标targetName
  2. 接口:当调用其他可执行文件/库otherTargetName的链接程序时,该可执行文件/库通过以下方式与targetName链接: / p>

    target_link_libraries(otherTargetName PUBLIC targetName)
    

    这被称为链接库的 transitive 属性。

很正确,没有为 static 库调用链接器,因此在这种情况下,消除了第一种情况。

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

target_link_libraries(otherTargetName PUBLIC libStatic)

然后CMake 自动将可执行文件(或共享库)与libStatictarget_link_libraries“链接”的所有内容链接。


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

  1. 通过致电

    target_link_libraries(libStatic PUBLIC lib1 lib2)
    

    您声明libStatic使用lib1lib2

  2. 中定义的函数
  3. 通过致电

    target_link_libraries(otherTargetName PUBLIC libStatic)
    

    您声明,可执行文件/库otherTargetName使用libStatic中的函数。

    在此阶段,您不在乎libStatic的内部结构,无论它是独立的还是依赖于其他库:CMake都会为您服务。

    p>

PUBLIC中使用target_link_libraries关键字的注意事项:虽然在某些情况下这等效于省略关键字,但现代的CMake方法是明确指定关键字。另请参见policy CMP0023

其他可能的关键字是PRIVATEINTERFACE,它们每个都仅选择上述单个方案。


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