库目标的 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++;目标lib1lib2 是库,目标e1 是可执行文件。现在,如果我写:

target_link_libraries(lib1 PRIVATE lib2)
target_link_libraries(e1 PRIVATE lib1)

当我构建e1 时,e1 是否一定会与lib2 相关联?

注意:如果答案因lib1/lib2 是静态库还是动态库而异,请说明。

【问题讨论】:

"... 目标 lib1lib2 是库(它们本身不需要链接,只需要编译)" - 你的意思是 lib1lib2静态库?因为共享​​>库肯定需要链接。 @Tsyvarev:删除了那段文字。见编辑。 【参考方案1】:

当我构建 e1 时,e1 是否必须与 lib2 链接?

是的。

但是e1 不会有INCLUDE_DIRECTORIESCOMPILE_DEFINITIONS 是来自lib2PUBLIC

【讨论】:

因此,PRIVATE 不适用于链接,仅适用于目标的其他属性。 它不适用于链接,因为如果 lib1 私下依赖于 lib2,则 e1 的链接仍然知道这种依赖关系(以及与 lib2 的链接),所以这不是真正的私人事情。

以上是关于库目标的 target_link_libraries PRIVATE 语义的主要内容,如果未能解决你的问题,请参考以下文章

CMake中target_link_libraries的使用

添加不存在的目标时强制 CMake target_link_libraries 失败

cmake中target_link_libraries()使用问题动态库使用绝对路径没问题,但是使用相对路径就矬了?

cmake-buildsystem

在CMake中如何使`TARGET_LINK_LIBRARIES'禁止第三方库代码发出警告?

CMake命令target_link_libraries链接库的顺序