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

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

| |->include |->src 

我正在为我的代码写一个CMakeLists.txt文件。 我想了解CMake include_directoriestarget_include_directories之间的区别。

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

include_directories(x/y)影响目录范围。 这个CMakeList中的所有目标以及所有在其调用点之后添加的子目录中的所有目标将具有添加到其包含path的pathx/y

target_include_directories(tx/y)具有目标范围 – 它将x/y添加到目标t的包含path。

如果所有目标都使用相关的包含目录,则需要前者。 如果path特定于目标,或者希望更好地控制path的可见性,则需要后者。 后者来自target_include_directories()支持PRIVATEPUBLICINTERFACE限定符的事实。

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

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

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