当我们的目标是静态库时,我对链接库感到困惑。
例如,对于可执行文件,它将帮助链接程序解析未定义的符号。但是,在使用静态库的情况下,为什么要在此阶段链接?
当我将some executable
链接到libstatic
时是否会链接?
谢谢。
答案 0 :(得分:2)
在CMake中,
target_link_libraries(targetName PUBLIC lib1 lib2)
在两种情况下会影响链接器的参数:
targetName
。 接口:当调用其他可执行文件/库otherTargetName
的链接程序时,该可执行文件/库通过以下方式与targetName
链接: / p>
target_link_libraries(otherTargetName PUBLIC targetName)
这被称为链接库的 transitive 属性。
很正确,没有为 static 库调用链接器,因此在这种情况下,消除了第一种情况。
但是第二种情况仍然存在:创建可执行文件(或其他共享库)并调用
target_link_libraries(otherTargetName PUBLIC libStatic)
然后CMake 自动将可执行文件(或共享库)与libStatic
与target_link_libraries
“链接”的所有内容链接。
这种自动化有助于构建项目:
通过致电
target_link_libraries(libStatic PUBLIC lib1 lib2)
您声明libStatic
使用lib1
和lib2
通过致电
target_link_libraries(otherTargetName PUBLIC libStatic)
您声明,可执行文件/库otherTargetName
使用libStatic
中的函数。
在此阶段,您不在乎libStatic
的内部结构,无论它是独立的还是依赖于其他库:CMake都会为您服务。
在PUBLIC
中使用target_link_libraries
关键字的注意事项:虽然在某些情况下这等效于省略关键字,但现代的CMake方法是明确指定关键字。另请参见policy CMP0023。
其他可能的关键字是PRIVATE
和INTERFACE
,它们每个都仅选择上述单个方案。
请注意,传递链接属性是纯CMake功能,仅在链接到目标时有效。库文件(.a
或.lib
)本身不包含有关依赖库的信息,因此与文件链接不会触发传递链接。