我有一个C ++代码的目录结构,如下所示:
|
|->include
|->src
我正在为我的代码编写CMakeLists.txt文件。我想了解include_directories
中target_include_directories
和CMake
之间的区别。
它们的用法和为了添加我应该使用的包含文件路径有什么区别?
答案 0 :(得分:95)
include_directories(x/y)
会影响目录范围。此CMakeList中的所有目标以及在其调用点之后添加的所有子目录中的目标都将在其包含路径中添加路径x/y
。
target_include_directories(t x/y)
具有目标范围 - 它会将x/y
添加到目标t
的包含路径中。
如果所有目标都使用相关的包含目录,则需要前者。如果路径特定于目标,或者您希望更精细地控制路径的可见性,则需要后者。后者来自target_include_directories()
支持PRIVATE
,PUBLIC
和INTERFACE
限定符这一事实。
答案 1 :(得分:31)
除了Angew's answer正确说明的内容之外,include_directories
和target_include_directories
之间的另一个非常重要的区别是,当与PUBLIC
或INTERFACE
一起使用时,后者会填充目标的INTERFACE_INCLUDE_DIRECTORIES
属性。当另一个目标使用target_link_libraries
链接到原始目标时,此属性很有用,因为链接目标将自动包含添加的目录。请参阅example。
这一重要功能非常隐藏在文档中:target_include_directories提到填充INTERFACE_INCLUDE_DIRECTORIES
,其documentation说:
使用target_link_libraries()指定目标依赖项时, CMake将从所有目标依赖项中读取此属性 确定消费者的构建属性。
答案 2 :(得分:1)
正如@Angew所说的,非常不同的是:
1,include_directories()可用于源树中的所有文件 如图2所示,仅在编译时可对特定目标访问target_include_directories()。