CMake4-指令2-2:include_directories(指定头文件查找路径)【将指定目录添加到编译器的“头文件”搜索路径之下】【对当前CMakeLists.txt文件的“所有”目标文件生效】

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
  • 将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。

  • 默认情况下,include_directories命令会将目录添加到列表最后,可以通过命令设置CMAKE_INCLUDE_DIRECTORIES_BEFORE变量为ON来改变它默认行为,将目录添加到列表前面。也可以在每次调用include_directories命令时使用AFTERBEFORE选项来指定是添加到列表的前面或者后面。

  • 如果使用SYSTEM选项,会把指定目录当成系统的搜索目录。该命令作用范围只在当前的CMakeLists.txt。

#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包含

# CMakeList.txt
cmake_minimum_required(VERSION 3.18.2)
project(include_directories_test)
add_executable(test main.cpp)
//main.cpp
#include "test.h"
#include <stdio.h>
int main(int argc, char **argv)
{
    printf("hello, world!\n");
    return 0;
}

执行cmake --build .,会提示找不到头文件的错误:

fatal error: 'test.h' file not found 
#include "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 <stdio.h>
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"也是可以的。

  • 场景1:不使用include_directories包含子目录sub,直接在main.cpp里面包含"test.h"
  • 场景2:使用include_directories包含子目录sub,并在main.cpp里面包含"test.h"

注意:推荐使用target_include_directories()命令为单独的目标添加包含目录,并可选择性地将它们传播/导出给依赖项。




include_directories — CMake 3.22.6 Documentation

Cmake命令之include_directories介绍 - 简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值