CMake学习笔记(二):变量设值,源文件/文件查找

一_变量设值:

在上一节中我们知道了如何去链接起来多个源文件并且生成可执行文件,但是当我们的源文件过多的时候会导致我们在add_executable里面写很长的一串,所以我们可以使用变量来进行设值:

set(<variable> <value>... [PARENT_SCOPE]) variable:变量名 value:变量的值 [PARENT_SCOPE]:可选):
如果指定,变量将被设置到父作用域中(例如在函数中定义的变量可以在函数外使用)。
在set中可以用了给变量进行设置值的操作,一般值的类似都是字符串的类型。

我们直接来看使用set完善后的结果:

cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
set(SRC_LIST div.cpp mul.cpp;sub.cpp;add.cpp main.cpp)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件

在这里我们给变量SRC_LIST设值的值就是后面跟着的那些div.cpp mul.cpp;sub.cpp;add.cpp main.cpp,这里我们可以看到可以使用空格或者;进行分隔,这里的message就类似一个输出语句,用来打印SRC_LIST里面的内容,在cmake中我们使用变量的值都是使用${}把变量框起来,当我们执行cmake ../后的结果如下:

从这里我们可以看出我们的message语句的输出结果可以在cmake 阶段进行打印。在实际的程序中,不同的团队或者个人的一些库的路径不同,我们再写cmakelists.txt的时候这些路径也不能写死,所以变量就给了我们很大的灵活性。这个我们后面是会经常使用到的。

二_源文件搜索:

        虽然变量的引入可以帮我们优化cmakelists.txt中对于源文件的使用,但是还是需要我们去一个一个的新增源文件,还是有点麻烦的。所以我们接下来介绍如何搜索源文件:

aux_source_directory(<dir> <variable>)
命令会扫描 <dir> 目录下的所有文件,将符合 CMake 默认支持的源文件扩展名(如 .c, .cpp, .cxx, .h 等)的 ​绝对路径 存储到 <variable> 变量中。

这个时候我们就可以把set那句话替换掉,然后将我们的源文件都放在一个新建的src的文件中:

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
aux_source_directory(src SRC_LIST)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

然后我们重新编译,就会发现,报错了:

这是因为头文件的位置不对导致的。那么我们只需要包含下头文件即可:

include_directories(./include)

这里我们同样也是新建一个include文件然后将头文件放到include里面,然后在生成可执行文件之前加入这句话即可,完整内容如下:

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
aux_source_directory(src SRC_LIST)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

三_文件搜索:

        既然说到了源文件的搜索,那么我们可以扩大点,简单来介绍下文件的搜索方式,在cmake中应该也会使用到:

# file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型) 
GLOB:将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中(仅当前目录)
GLOB_RECURSE:当前目录下的所有子目录

还是使用上面那个例子,不过我们不使用aux_source_directory。具体如下(GLOB版本):

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB SRC_LIST"src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

(GLOB_RECURSE 版本,可以在src目录下新增一个文件夹cpp_1,然后把src原来下的cpp文件都移动进去,这样使用GLOB的版本就会报错):

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST"src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35329.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【Function】Azure Function通过托管身份或访问令牌连接Azu…

案例5_1:单位数码管显示0

文章目录 文章介绍效果图仿真图5_1放置单位数码管 代码5_1.c 文章介绍 效果图 仿真图5_1 复制案例1_2的仿真图&#xff0c;在此基础上修改 注意&#xff1a;栅格大小需要缩小 放置单位数码管 代码5_1.c #include <reg52.h>#define uchar unsigned char #define uint un…

helm部署metricbeat

背景 在Elastic Stack 7.5版本之前&#xff0c;系统默认采用内置服务进行监控数据采集&#xff08;称为内部收集机制&#xff09;&#xff0c;这种设计存在显著局限性&#xff1a; 当ES集群崩溃时自带的节点监控也会随之崩溃&#xff0c;直到集群恢复前&#xff0c;崩溃期间的…

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中&#xff0c;我们经常需要获取社交媒体平台的数据&#xff0c;例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据&#xff0c;并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前&#xff0c;我…

阿里云、腾讯云云主机如何提升远程桌面安全(VNC登录)

远程桌面连接&#xff08;RDP&#xff09;是管理主机的常用方式&#xff0c;但同时也带来了安全风险。黑客会对远程桌面进行暴力破解攻击和撞库攻击。作为云主机&#xff0c;在远程桌面方面有天然的安全优势&#xff1a;可以关闭远程桌面服务或端口&#xff0c;限制只能通过网页…

【etcd】

一、ETCD 简介 etcd是一个由CoreOS团队开发的开源项目&#xff0c;旨在提供一个高可用的、分布式的、一致的键值存储&#xff0c;用于配置共享和服务发现。尽管它看起来像一个键值存储&#xff0c;但etcd的设计目标远远超出了传统数据库的功能范围。 etcd的核心特性包括&…

深圳南柯电子|医疗设备EMC检测测试整改:保障患者安全的第一步

在医疗设备领域&#xff0c;电磁兼容性&#xff08;EMC&#xff09;是确保设备安全、有效运行的关键指标。随着医疗技术的飞速发展&#xff0c;医疗设备日益复杂&#xff0c;其电磁环境也愈发复杂多变。EMC检测测试及整改因此成为医疗设备研发、生产、销售过程中不可或缺的一环…

项目实战系列:基于瑞萨RA6M5构建多节点OTA升级-系统设计<一>

项目背景 原嵌入式控制系统采用分布式模块化架构&#xff0c;由12个功能板卡&#xff08;通信控制、信号采集、驱动执行等&#xff09;组成。系统维护阶段存在以下痛点&#xff1a; 低效的本地烧录机制&#xff1a;各板卡固件升级需通过JTAG接口逐一手动连接JLINK仿真器&#x…

五大方向全面对比 IoTDB 与 OpenTSDB

对比系列第三弹&#xff0c;详解 IoTDB VS OpenTSDB&#xff01; 之前&#xff0c;我们已经深入探讨了时序数据库 Apache IoTDB 与 InfluxDB、Apache HBase 在架构设计、性能和功能方面等多个维度的区别。还没看过的小伙伴可以点击阅读&#xff1a; Apache IoTDB vs InfluxDB 开…

RAGFlow部署与使用(开源本地知识库管理系统,包括kibana配置)

一、RAGFlow 简介 戳我访问RAGFlow RAGFlow 是一款基于深度文档理解构建的开源 RAG&#xff08;Retrieval-Augmented Generation&#xff09;引擎。它可以给我们搭建本地知识库&#xff0c;将用户的知识文档上传到RAGFlow后&#xff0c;通过文档切分、向量入库&#xff0c;在…

HTB 学习笔记 【中/英】《Web 应用 - 布局》P2

&#x1f4cc; 这篇文章讲了什么&#xff1f; 介绍了 Web 应用的架构和布局&#xff0c;包括不同的基础设施、组件、架构模式等。讲解了 常见的 Web 应用部署方式&#xff08;单服务器、多服务器等&#xff09;&#xff0c;并分析了它们的安全性。介绍了 微服务架构&#xff0…

蓝牙系统的核心组成解析

一、硬件层&#xff1a;看得见的物理载体 1. 射频模块&#xff08;Radio Frequency Module&#xff09; 专业描述&#xff1a;工作在2.4GHz ISM频段&#xff0c;支持GFSK/π/4 DQPSK/8DPSK调制方式 功能类比&#xff1a;相当于人的"嘴巴"和"耳朵" 发射端…

LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0

前言 过去2年多的深入超过此前7年&#xff0c;全靠夜以继日的勤奋&#xff0c;一天当两天用&#xff0c;抠论文 抠代码 和大模型及具身同事讨论&#xff0c;是目前日常 而具身库里&#xff0c;idp3、π0、lerobot值得反复研究&#xff0c;故&#xff0c;近期我一直在抠π0及l…

ISP--Gamma Correction

文章目录 现象Gamma产生的原因CRT属性导致人眼的亮度特性 gamma校正LUT法线性插值法模拟gamma法 现象 从上往下看左侧黑色块黑得越来越严重&#xff0c;对比度也在逐渐加深。此时灰阶的高亮区获得的数据位变少&#xff0c;暗区获得的数据位变多&#xff0c;暗区细节会更多。但是…

光谱相机识别瓶子材质的技术原理和应用案例

一、技术原理 ‌光谱特征差异识别‌ 不同材质的塑料&#xff08;如PET、PP、PE等&#xff09;因化学结构差异&#xff0c;在近红外或可见光波段会呈现独特的光谱反射曲线。例如&#xff0c;高光谱相机通过分析数百个窄波段的光谱数据&#xff0c;可生成每种材质的“光谱指纹”…

某快餐店用户市场数据挖掘与可视化

1、必要库的载入 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns2、加载并清洗数据 # 2.1 加载数据 df pd.read_csv(/home/mw/input/survey6263/mcdonalds.csv)# 2.2 数据清洗 # 2.2.1 检查缺失值 print(缺失值情况&#xff1a;) print(df.isn…

MySQL 衍生表(Derived Tables)

在SQL的查询语句select …. from …中&#xff0c;跟在from子句后面的通常是一张拥有定义的实体表&#xff0c;而有的时候我们会用子查询来扮演实体表的角色&#xff0c;这个在from子句中的子查询会返回一个结果集&#xff0c;这个结果集可以像普通的实体表一样查询、连接&…

Electron使用WebAssembly实现CRC-16 MAXIM校验

Electron使用WebAssembly实现CRC-16 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-16 MAXIM格式校验的方式。 CRC-16 MAXIM校验函数WebAssembly源文件 C语言实…

HTB 学习笔记 【中/英】《前端 vs. 后端》P3

&#x1f4cc; 这篇文章讲了什么&#xff1f; 介绍了 前端&#xff08;客户端&#xff09; 和 后端&#xff08;服务器端&#xff09; 的区别。解释了 全栈开发&#xff08;Full Stack Development&#xff09;&#xff0c;即前端后端开发。介绍了 前端和后端常用的技术。讨论…

SpringBoot集成ElasticSearch实现支持错别字检索和关键字高亮的模糊查询

文章目录 一、背景二、环境准备1.es8集群2.Kibana3.Canal 三、集成到SpringBoot1.新增依赖2.es配置类3.建立索引4.修改查询方法 四、修改前端 一、背景 我们在开发项目的搜索引擎的时候&#xff0c;如果当数据量庞大、同时又需要支持全文检索模糊查询&#xff0c;甚至你想做到…