cmake进阶:目录属性之 INCLUDE_DIRECTORIES说明一

2024-05-08 03:12

本文主要是介绍cmake进阶:目录属性之 INCLUDE_DIRECTORIES说明一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 简介

前一篇文章学习了 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()命令设置属性时,需要使用绝对路径!!!

这篇关于cmake进阶:目录属性之 INCLUDE_DIRECTORIES说明一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969145

相关文章

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE