我的C ++代码有一个目录结构,如下所示:
|
|->include
|->src
我正在为我的代码编写CMakeLists.txt文件。我想明白之间的差别include_directories
,并target_include_directories
在CMake
。
它们的用法和要添加我的包含文件路径之间的区别是什么?
我的C ++代码有一个目录结构,如下所示:
|
|->include
|->src
我正在为我的代码编写CMakeLists.txt文件。我想明白之间的差别include_directories
,并target_include_directories
在CMake
。
它们的用法和要添加我的包含文件路径之间的区别是什么?
Answers:
include_directories(x/y)
影响目录范围。此CMakeList中的所有目标,以及在其调用点之后添加的所有子目录中的目标,均会将路径x/y
添加到其包含路径中。
target_include_directories(t x/y)
具有目标范围-它添加x/y
到target的包含路径t
。
如果所有目标都使用相关的包含目录,则需要前一个目录。如果路径特定于目标,或者想要更好地控制路径的可见性,则需要后一种。后者来自于这样的事实target_include_directories()
支持PRIVATE
,PUBLIC
和INTERFACE
预选赛。
x/y
中使用的任何依赖目标的包含路径的附加好处。前者当然有地方,但我相信后者通常会更好。t
target_link_libraries
include_directories
会受到影响。我正在编辑答案:文档明确指出当前CMakeLists中的所有目标均受到影响。该文档没有提及,只是呼叫后的子目录受到影响(如原始答案中正确说明的那样)
target_include_directories
已在CMake 2.8.11(2013
除了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将从所有目标依赖关系中读取此属性,以确定使用者的构建属性。
PUBLIC
etc属性的可理解的解释!谢谢:D
include_directories
和target_include_directories
?您不了解它们之间的区别是什么?