cmake - target_link_libraries(libstatic libfoo libbar) 会发生什么?
问题描述
当我们的目标是静态库时,我对链接库有点困惑。
例如,对于可执行文件,它将帮助链接器解析未定义的符号。但是,如果是静态库,为什么要在这个阶段链接?
当我链接some executable
反对时,链接不会完成libstatic
吗?
谢谢。
解决方案
在 CMake 中,
target_link_libraries(targetName PUBLIC lib1 lib2)
在两种情况下影响链接器的参数:
- PRIVATE:当为可执行文件/库调用链接器时,对应于 target
targetName
。 INTERFACE:当为其他可执行文件/库调用链接器时,该链接器
otherTargetName
与targetName
via链接target_link_libraries(otherTargetName PUBLIC targetName)
这被称为链接库的传递属性。
您是对的,没有为静态库调用链接器,因此在这种情况下,第一种情况被消除了。
但是第二种情况仍然存在:当您创建可执行文件(或其他共享库)并调用
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
关键字 in 的注意事项target_link_libraries
:虽然在某些情况下这相当于省略关键字,但现代 CMake 方法是显式指定关键字。另见政策 CMP0023。
其他可能的关键字是PRIVATE
and INTERFACE
,它们中的每一个都只选择上面描述的一个场景。
请注意,传递链接属性是纯 CMake 功能,仅在链接到目标时才有效。库文件 (.a
或.lib
) 本身不包含有关依赖库的信息,因此与文件的链接不会触发传递链接。
推荐阅读
- c# - 仅在受保护的构造函数中设置的属性
- python - MongoEngine 中的经典映射
- python - Python中的这些类有什么区别?
- c++ - 为什么微软在新代码中使用结构而不是类?
- java - 使用 Java 中的反射以特定方式打印带有参数的方法
- c++ - C ++“错误:重载运算符'*'的使用不明确”似乎只有一个匹配项
- elasticsearch - Elasticsearch 在双引号之外标记化
- string - Kotlin - 是否有一个基本函数可以用引用字符串中的多个字符串替换多个字符串?
- python - Visual Studio Code 语法突出显示不起作用
- terraform - 如何在terraform中将列表输入传递给aws vpc elb