库目标的 target_link_libraries PRIVATE 语义
Posted
技术标签:
【中文标题】库目标的 target_link_libraries PRIVATE 语义【英文标题】:semantics of target_link_libraries PRIVATE for a library target 【发布时间】:2021-12-20 20:03:51 【问题描述】:在CMake documentation for target_link_libraries 中,它说:
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <item>... [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
PUBLIC、PRIVATE 和 INTERFACE 关键字可用于在一个命令中指定链接依赖项和链接接口。
PUBLIC
之后的库和目标已链接到并生成 链接接口的一部分。关注PRIVATE
的库和目标 链接到链接接口,但不是链接接口的一部分。图书馆 以下INTERFACE
被附加到链接接口,而不是 用于链接。
我不太明白这如何应用于库目标。
假设我的语言是 C 或 C++;目标lib1
和lib2
是库,目标e1
是可执行文件。现在,如果我写:
target_link_libraries(lib1 PRIVATE lib2)
target_link_libraries(e1 PRIVATE lib1)
当我构建e1
时,e1
是否一定会与lib2
相关联?
注意:如果答案因lib1
/lib2
是静态库还是动态库而异,请说明。
【问题讨论】:
"... 目标lib1
和 lib2
是库(它们本身不需要链接,只需要编译)" - 你的意思是 lib1
和 lib2
是 静态库?因为共享>库肯定需要链接。
@Tsyvarev:删除了那段文字。见编辑。
【参考方案1】:
当我构建 e1 时,e1 是否必须与 lib2 链接?
是的。
但是e1
不会有INCLUDE_DIRECTORIES
或COMPILE_DEFINITIONS
是来自lib2
的PUBLIC
。
【讨论】:
因此,PRIVATE
不适用于链接,仅适用于目标的其他属性。
它不适用于链接,因为如果 lib1 私下依赖于 lib2,则 e1 的链接仍然知道这种依赖关系(以及与 lib2 的链接),所以这不是真正的私人事情。以上是关于库目标的 target_link_libraries PRIVATE 语义的主要内容,如果未能解决你的问题,请参考以下文章
CMake中target_link_libraries的使用
添加不存在的目标时强制 CMake target_link_libraries 失败
cmake中target_link_libraries()使用问题动态库使用绝对路径没问题,但是使用相对路径就矬了?