CMake 目标 INTERFACE_INCLUDE_DIRECTORIES 是不是自动添加到父 INCLUDE_DIRECTORIES?

Posted

技术标签:

【中文标题】CMake 目标 INTERFACE_INCLUDE_DIRECTORIES 是不是自动添加到父 INCLUDE_DIRECTORIES?【英文标题】:Are CMake target INTERFACE_INCLUDE_DIRECTORIES automatically added to parent INCLUDE_DIRECTORIES?CMake 目标 INTERFACE_INCLUDE_DIRECTORIES 是否自动添加到父 INCLUDE_DIRECTORIES? 【发布时间】:2020-02-03 23:49:50 【问题描述】:

在包含 CMakeLists.txt 的目录“fred”中:

add_library(fred)
...
target_include_directories(fred PUBLIC "inc")

这会使用“inc”填充 fred 的目标 INTERFACE_INCLUDE_DIRECTORIES 属性

调用 add_subdirectory(fred) 的目录是否会自动获取其 INCLUDE_DIRECTORIES 属性并附加 freds INTERFACE_INCLUDE_DIRECTORIES 属性(“inc”),还是我应该手动执行此操作?

我问,因为我有一个有两个 add_subdirectory 命令的项目,一个添加的包含路径似乎可用于代码,但不能用于另一个,不确定我是否搞砸了或误解了!

提前致谢

【问题讨论】:

the directory .. get its INCLUDE_DIRECTORIES property 目录没有属性。目标具有属性。每个目标都有自己的属性。 am I expected to do that manually? 到底是做什么的?您将如何手动执行此操作? be available to code [one?], but not the other, 如果它们之间没有依赖关系,那么根据您的解释,这正是应该发生的情况。 【参考方案1】:

包含目录将传播到链接到该库的任何目标。这意味着添加子目录是不够的。你还需要有

target_link_libraries(MyProject <PRIVATE|PUBLIC|INTERFACE> fred)

这将添加 myProject 的 fred 的包含目录。您可以在此处找到有关target_link_libraries 的更多信息。

【讨论】:

啊,谢谢,这很有意义...我研究了我正在使用的命令的帮助,但没有研究 target_link_libraries。虽然,我仍然有两个子目录,一个完全按照你所说的链接,一个没有。我想我将不得不进一步调试我的 cmake 文件......

以上是关于CMake 目标 INTERFACE_INCLUDE_DIRECTORIES 是不是自动添加到父 INCLUDE_DIRECTORIES?的主要内容,如果未能解决你的问题,请参考以下文章

将目标属性添加到 CMake 中现有的导入库

CMake 的默认构建目标的名称是啥?

CMake:啥是可能的目标源类型,它们可以扩展吗?

从 CMake 中的自定义目标运行目标

CMake基础教程(30)CMake构建系统概览

CMake基础教程(30)CMake构建系统概览