CMake中include_directories和target_include_directories有什么区别?

Ujj*_*yan 107 c++ cmake

我有一个C++代码的目录结构,如下所示:

|
|->include
|->src
Run Code Online (Sandbox Code Playgroud)

我正在为我的代码编写一个CMakeLists.txt文件.我想明白之间的差别include_directories,并target_include_directoriesCMake.

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

Rei*_*ica 113

include_directories(x/y)影响目录范围.此CMakeList中的所有目标以及在其调用点之后添加的所有子目录中的目标都将将路径x/y添加到其包含路径中.

target_include_directories(t x/y)具有目标范围 - 它添加x/y到目标的包含路径t.

如果所有目标都使用相关的包含目录,则需要前者.如果路径特定于目标,或者您希望更精细地控制路径的可见性,则需要后者.后者来自于这样的事实target_include_directories()支持PRIVATE,PUBLICINTERFACE预选赛.

  • 我认为后者应该首选(只要一个人使用cmake 3).它还有一个额外的好处,就是在``target_link_libraries``命令中使用``t``的任何依赖目标的include路径中放置``x/y``.当然前者有一席之地,但我相信后者通常会更好. (32认同)
  • 原始答案指出,只有在 `include_directories` 之后添加的目标和子目录会受到影响。我正在编辑答案:文档明确指出当前 CMakeLists 中的 *all* 目标受到影响。文档没有提到,但只有在呼叫受到影响后的子目录(如原始答案中所述) (2认同)

Ant*_*nio 34

除了什么Angew的答案正确地说,之间的另一个很重要的区别include_directories,并target_include_directories是,随着使用时PUBLICINTERFACE,后者填充INTERFACE_INCLUDE_DIRECTORIES对象的属性.当另一个目标用于target_link_libraries链接到原始目标时,此属性很有用,因为链接目标将自动包含添加的目录.见例子.

这个重要的功能很好地隐藏在文档中:target_include_directories提到填充INTERFACE_INCLUDE_DIRECTORIES,其文档说:

当使用target_link_libraries()指定目标依赖项时,CMake将从所有目标依赖项中读取此属性,以确定使用者的构建属性.

  • 这是我第一次阅读对“PUBLIC”等属性的可以理解的解释!感谢:D (2认同)
  • 如果您想了解更多有关关键字“PRIVATE”、“PUBLIC”和使用“target_include_directories”的“INTERFACE” (2认同)

小智 5

正如@Angew 所说,非常不同的是:

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