我有一个我的c++代码的目录结构是这样的:

|
|->include
|->src

我正在为我的代码编写CMakeLists.txt文件。我想了解include_directories和target_include_directories在CMake中的区别。

它们的用法有什么区别,为了添加我的包含文件路径,我应该使用哪一个?


Include_directories (x/y)影响目录作用域。这个CMakeList中的所有目标,以及在调用点之后添加的所有子目录中的目标,都将把路径x/y添加到它们的包含路径中。

Target_include_directories (t x/y)具有目标作用域—它将x/y添加到目标t的包含路径中。

如果所有目标都使用包含目录,则需要前者。如果路径特定于目标,或者希望更好地控制路径的可见性,则需要后一种方法。后者来自target_include_directories()支持PRIVATE、PUBLIC和INTERFACE限定符。


除了Angew的回答正确之外,include_directories和target_include_directories之间的另一个非常重要的区别是,当与PUBLIC或INTERFACE一起使用时,后者填充目标的INTERFACE_INCLUDE_DIRECTORIES属性。当另一个目标使用target_link_libraries链接到原始目标时,此属性非常有用,因为链接目标将自动添加那些包含目录。看到的例子。

这个重要的特性在文档中隐藏得很好:target_include_directories提到填充INTERFACE_INCLUDE_DIRECTORIES,它的文档说:

当使用target_link_libraries()指定目标依赖关系时, CMake会将此属性从所有目标依赖项读取到 确定使用者的构建属性。


正如@Angew所说,两者的区别在于:

1, include_directories()可以被源代码树中的所有文件访问 2、target_include_directories()在编译时仅对特定目标可访问。