CMake中的include_directories和target_include_directories有什么区别?
What is the difference between include_directories and target_include_directories in CMake?
我的c++代码的目录结构是这样的:
|
|->include
|->src
我正在为我的代码写一个CMakeLists.txt文件。我想了解CMake
中include_directories
和target_include_directories
的区别
它们的用法有什么区别,为了添加我的包含文件路径,我应该使用哪一个?
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()在编译时仅对特定目标可访问。
- 既然存在危险,为什么项目要使用-I include开关
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何将更多文件夹添加到c++include路径
- 什么是"#include <boost/functional/hash.hpp> "?
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- C++包含来自 #include "DevEngine/Core.h" 的错误
- <filesystem> 在 clang 6 和 10 上 #include 错误
- 在 void 函数中使用 #include 变量C++
- N-API include an .so or dll
- 允许哪些令牌作为 #include 的参数?
- GCC 包含标头(使用"-include")CMake 未检测到的更改
- WebAssembly include OpenCV
- 如何在 c++ 中正确指定 #include 路径以使程序可移植
- 修改生成文件以简化框架 #include 路径
- VS2015/VC++ 在新类模板中禁用默认 #include "stdafx.h"
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 如何将构建的C++库安装到 /usr/include?
- 包含一批库和目录路径以"Include Additional Directories"视觉C++的任意方法
- 我如何知道 Ubuntu 11.04 中 gcc、g++/c++ 的"default include directories"、"default link directories"和"default