CMake中的include_directories和target_include_directories有什么区别?


134

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

|
|->include
|->src

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

它们的用法和要添加我的包含文件路径之间的区别是什么?


4
你读过的文档include_directoriestarget_include_directories?您不了解它们之间的区别是什么?
一些程序员哥们

73
文档中没有明确说明。我阅读并推测了Angew在他的回答中写的内容,但是没有描述,没有示例,对于用于项目构建的系统,CMake文档中没有基于项目的示例。如果有关于CMake的详尽详尽的文档,我不会给社区带来这些问题的负担。
Ujjwal Aryan 2015年

cmake的概念文献很少。特别是目标和“非目标”。
约翰·格林

Answers:


148

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

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

如果所有目标都使用相关的包含目录,则需要前一个目录。如果路径特定于目标,或者想要更好地控制路径的可见性,则需要后一种。后者来自于这样的事实target_include_directories()支持PRIVATEPUBLICINTERFACE预选赛。


35
我认为通常最好使用后者(只要使用cmake 3)。它具有在命令x/y中使用的任何依赖目标的包含路径的附加好处。前者当然有地方,但我相信后者通常会更好。ttarget_link_libraries
Phil

2
原始答案指出,仅此后添加的目标和子目录include_directories会受到影响。我正在编辑答案:文档明确指出当前CMakeLists中的所有目标均受到影响。该文档没有提及,只是呼叫后的子目录受到影响(如原始答案中正确说明的那样)
tamas.kenez

@Phil target_include_directories已在CMake 2.8.11(2013
tamas.kenez,2015年

@ tamas.kenez感谢您引起我的注意,已修复。我非常确信这是“从现在开始”的事情。
Angew不再为2015年

40

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

该重要功能已很好地隐藏在文档中:target_include_directories提到了populating INTERFACE_INCLUDE_DIRECTORIES,其文档中说:

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


这是我第一次阅读PUBLICetc属性的可理解的解释!谢谢:D
RL-S

2

就像@Angew所说的,非常不同的是:

在图1中,对于源树中的所有文件,include_directories()是可访问的,在编译时,仅对特定目标可访问target_include_directories()。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.