命令格式
include_directories
([AFTER|BEFORE
] [SYSTEM
] dir1 [dir2 ...])
将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
命令解析
默认情况下,include_directories
命令会将目录添加到列表最后,可以通过命令设置CMAKE_INCLUDE_DIRECTORIES_BEFORE
变量为ON
来改变它默认行为,将目录添加到列表前面。也可以在每次调用include_directories
命令时使用AFTER
或BEFORE
选项来指定是添加到列表的前面或者后面。如果使用SYSTEM
选项,会把指定目录当成系统的搜索目录。该命令作用范围只在当前的CMakeLists.txt。
一、include_directories
命令的基本行为:
- #CMakeLists.txt
- cmake_minimum_required(VERSION 3.18.2)
- project(include_directories_test)
-
- include_directories(sub)
- include_directories(sub2) #默认将sub2添加到列表最后
- include_directories(BEFORE sub3) #可以临时改变行为,添加到列表最前面
-
- get_property(dirs DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
- message(">>> include_dirs=${dirs}") #打印一下目录情况
-
- set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON) #改变默认行为,默认添加到列表前面
- include_directories(sub4)
- include_directories(AFTER sub5) #可以临时改变行为,添加到列表的最后
- get_property(dirs DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
- message(">>> SET DEFAULT TO BEFORE, include_dirs=${dirs}")
- #输出
- >>> include_dirs=/XXX/XXX/sub3;/XXX/XXX/sub;/XXX/XXX/sub2
- >>> SET DEFAULT TO BEFORE, include_dirs=/XXX/XXX/sub4;/XXX/XXX/sub3;/XXX/XXX/sub;/XXX/XXX/sub2;/XXX/XXX/sub5
二、下面结合实际的头文件包含来说明其用法,创建的文件和目录结构及说明如下:
├── CMakeLists.txt #最外层的CMakeList.txt
├── main.cpp #源文件,包含被测试的头文件
├── sub #子目录
└── test.h #测试头文件,是个空文件,被外层的main,cpp包含
include_directories
包含子目录sub
,直接在main.cpp
里面包含"test.h"
。- # CMakeList.txt
- cmake_minimum_required(VERSION 3.18.2)
- project(include_directories_test)
- add_executable(test main.cpp)
- //main.cpp
- #include "test.h"
- #include
- int main(int argc, char **argv)
- {
- printf("hello, world!\n");
- return 0;
- }
执行cmake --build .
,会提示找不到头文件的错误:
- fatal error: 'test.h' file not found
- #include "test.h"
include_directories
包含子目录sub
,并在main.cpp
里面包含"test.h"
。- # CMakeList.txt
- cmake_minimum_required(VERSION 3.18.2)
- project(include_directories_test)
- include_directories(sub) #与上个场景不同的地方在于此处
- add_executable(test main.cpp)
- //main.cpp
- #include "test.h"
- #include
- int main(int argc, char **argv)
- {
- printf("hello, world!\n");
- return 0;
- }
执行cmake --build .
,会生成可执行文件test
,使用./test
执行后会输出打印hello, world!
。当然,不使用include_directories(sub)
,在main.cpp
中直接使用#include "sub/test.h"
也是可以的。