Cmake:将子目录链接模式覆盖为 LINK_PRIVATE

Posted

技术标签:

【中文标题】Cmake:将子目录链接模式覆盖为 LINK_PRIVATE【英文标题】:Cmake: Override subdirectory link mode to LINK_PRIVATE 【发布时间】:2013-10-08 02:16:44 【问题描述】:

我有一个相当大的 3rd 方 cmake 目录作为我的一些项目所依赖的项目的一部分。我使用 add_subdirectory() 将此目录导入到我的依赖项目中。不幸的是,这也会将第 3 方项目链接到的库导入到我的项目中。

我可以通过在第三方目录的 cmakelists.txt 文件中为 target_link_libraries() 命令指定 LINK_PRIVATE 来手动解决此问题。我更喜欢使用 set_property 或类似方法从 cmakelists 中远程执行此操作。

这可能吗?

【问题讨论】:

【参考方案1】:

一般来说,当使用add_subdirectory 时,这样的效果很难控制。除了构建目标之外,您可能还会对全局和缓存变量、测试和其他地方产生类似的污染影响,这就是为什么我不建议将这种方法用于第三个库依赖项。

ExternalProject 模块提供了一种更简洁的方法。这为您提供了一个命令ExternalProject_Add,可用于使用 CMake(或其他构建系统)配置和构建第三方库。这里的好处是库的 CMake 运行完全独立于你自己,所以没有污染影响。缺点是该库中的任何目标都不会自动导入到您自己的项目中,因此您可能需要一些额外的胶水代码才能将它们重新导入。不过,总的来说,这应该是一种更简洁的方法。

【讨论】:

这很棒,我不知道它存在。使用这个模块确实干净多了。

以上是关于Cmake:将子目录链接模式覆盖为 LINK_PRIVATE的主要内容,如果未能解决你的问题,请参考以下文章

具有覆盖范围的 CMake ninja 将 gcno 文件放在根二进制目录中

CMAKE将动态库链接到模块,但不显示为链接依赖

cmake - 全局链接器标志设置(适用于目录中的所有目标)

CMake基础教程(26)find_package搜索包完成库链接和头文件添加(module模式)

将具有循环链接依赖的makefile转换为CMake

在 cmake 配置后的链接阶段不尊重 BOOST_ROOT