一. 简介
前一篇文章学习了 cmake的一些目录属性,其中最重要的是 头文件搜索路径。文章如下:
cmake进阶:目录属性说明一-CSDN博客
本文主要学习 一个目录属性 INCLUDE_DIRECTORIES,即头文件搜索路径。
二. cmake进阶:目录属性之 INCLUDE_DIRECTORIES
1. INCLUDE_DIRECTORIES
此属性 是 目 录 的 头 文 件 搜 索 路 径 列表, 其 实 就 是 include_directories() 命 令 所 添 加 的 目 录 。
include_directories() 命 令 会 将 指 定 的 目 录 添 加 到 INCLUDE_DIRECTORIES 属 性 中 , 所 以 INCLUDE_DIRECTORIES 属性其实就是一个头文件搜索路径列表。
准备一个C工程,顶层CMakeLists.txt文件中代码如下:
cmake_minimum_required("VERSION" "3.16") #cmake最低版本要求
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
#获取目录的 INCLUDE_DIRECTORIES 属性
get_directory_property(out_var INCLUDE_DIRECTORIES)
message("${out_var}")
#调用 include_directories 添加头文件搜索目录
include_directories(include)
#再次获取 INCLUDE_DIRECTORIES 属性
get_directory_property(out_var INCLUDE_DIRECTORIES)
message("${out_var}")
#再次调用 include_directories,将目录放在列表前面
include_directories(BEFORE hello)
#再次获取 INCLUDE_DIRECTORIES 属性
get_directory_property(out_var INCLUDE_DIRECTORIES)
message("${out_var}")
本例中,使用了
get_directory_property()
命令,该命令用于获取目录的属性,使用方法如下:
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)
将属性的值存储在
variable
变量中;
第二个参数是一个可选参数,可指定一个目录,如果不指定,则默认是当前源码所在目录;
第三个参数
prop-name
表示对应的属性名称。
进入 build目录下, 运行 "cmake .." 命令后,打印信息如下:
第一个
message
打印的是空信息,说明此时
INCLUDE_DIRECTORIES
是空的,没有添加任何目录。
include_directories()
命令默认将目录添加到
INCLUDE_DIRECTORIES
列表的末尾,可显式指定
BEFORE
或
AFTER
将目录添加到列表的前面或后面。
2. 使用 set_directory_properties() 命令设置 INCLUDE_DIRECTORIES 属性
既然如此,那是不是可以直接去设置 INCLUDE_DIRECTORIES 属性来添加头文件搜索目录,而不使用 include_directories()命令来添加?
这样当然是可以的,可以使用 set_directory_properties()命令设置目录属性。
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
接下来进行测试,假设工程目录结构如下所示:
源文件
main.c
中包含了
hello.h
头文件,
hello.h
头文件在
include
目录下。
顶层
CMakeLists.txt
如下:
cmake_minimum_required("VERSION" "3.16") #cmake最低版本要求
project(TEST VERSION 1.1.0) #设置工程版本号为 1.1.0
add_subdirectory(include)
set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES /home/wangtian/Code_Learns/C_Learns/test/cmake/test/include)
get_directory_property(out_var INCLUDE_DIRECTORIES)
message("${out_var}")
add_executable(test main.c)
target_link_libraries(test libhello)
进入到 build 目录下,执行 "cmake .." 命令、make 构建、编译:
需要注意的是,调用 set_directory_properties()命令设置属性时,需要使用绝对路径!!!