news 2026/4/26 0:12:52

cmake_第二章 CMake基础语法_cmake列表命令list(),字符串string()和aux_source_directory()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cmake_第二章 CMake基础语法_cmake列表命令list(),字符串string()和aux_source_directory()

文章目录

  • 第二章 CMake基础语法
    • 2.6 CMake列表命令list()
      • 2.6.1 list语法
      • 2.6.2 测试 list 子命令用法
        • 2.6.2.1 message加引号和不加引号区别
        • 2.6.2.2 测试list子命令
    • 2.7 CMake字符串命令string()
    • 2.8 aux_source_directory()命令搜索目录下源文件
      • 2.8.1 自动搜索源文件
      • 2.8.2 测试

本文介绍cmake列表命令list(),字符串string()和aux_source_directory()

第二章 CMake基础语法

2.6 CMake列表命令list()

虽然CMake 中的所有值都存储为字符串,但在某些上下文中字符串可能会被视为列表,CMake列表使用分号 ; 进行分隔。
例如set(VAR a.c b.c c.c)实际上是保存为了列表“a.c;b.c;c.c”.

2.6.1 list语法

语法规则:

list(<subcommand><list-variable>[<args>...])<subcommand>: 必须指定的操作类型(如 APPEND, GET, LENGTH 等)。<list-variable>: 变量名(注意:这里传的是变量的名字 num,而不是变量的值${num})。[<args>...]: 该子命令所需的参数(如要添加的值、索引等)。

子命令:

LENGTH 返回列表的长度 GET 获取列表指定下标位置的元素 APPEND 在列表末尾添加元素 PREPEND 在列表头部添加元素 INSERT 将元素插入到列表的指定索引处。索引超出范围会引起错误; POP_BACK 如果未给出变量名称,则仅删除最后一个元素。否则提供N个变量名称,删除最后N 个赋给相应变量 POP FRONT 如果未给出变量名称,则仅删除最前一个元素。否则提供N 个变量名称,删除最前N 个赋给相应变量 REMOVE AT 从列表中删除给定索引处的项目。 REMOVE ITEM 从列表中删除给定项目的所有实例。 REMOVE DUPLICATES 删除列表中的重复项目。保留项目的相对顺序,但如果遇到重复项则仅保留第一个实例。 SORT 按字母顺序对列表进行就地排序。

2.6.2 测试 list 子命令用法

list.cmake 脚本文件

2.6.2.1 message加引号和不加引号区别
cmake_minimum_required(VERSION3.11)# 定义变量:变量名字区分大小写set(NUMS12345)message(${NUMS})#12345message("NUMS = ${NUMS}")# NUMS=1;2;3;4;5

可以看出,如果在Message中加上 " ",输出的字符串就会以 ; 分割;
【记住:加了引号多输出; 不加引号少输出 】

2.6.2.2 测试list子命令
cmake_minimum_required(VERSION3.11)# 定义变量:变量名字区分大小写set(NUMS12345)message(${NUMS})# 12345message("NUMS =${NUMS}")# NUMS = 1;2;3;4;5# 可以看出,如果在Message中加上 " ",输出的字符串就会以 ; 分割# 1、测试字符串(set(NUMS 1 2 3 4 5))长度list(LENGTH NUMS LEN)message("LEN =${LEN}")# LEN = 5# 2、GET 获取列表指定索引的元素list(GET NUMS3FIRST)# 获取第X个索引的元素message("FIRST =${FIRST}")# FIRST = 4# 3、APPEND 在列表末尾添加元素list(APPEND NUMS6)# 在列表末尾添加元素message("NUMS =${NUMS}")# NUMS = 1;2;3;4;5;6# 4、PREPEND 在列表头部插入元素list(PREPEND NUMS"first")message("NUMS =${NUMS}")# NUMS = first;1;2;3;4;5;6# 5、INSERT 在列表指定位置插入元素list(INSERT NUMS3"insert")# 在列表第3个位置插入元素message("NUMS =${NUMS}")# NUMS = first;1;2;insert;3;4;5;6# 6、REMOVE_AT 从列表中删除指定索引的元素list(REMOVE_AT NUMS3)# 删除列表第3个位置的元素message("NUMS =${NUMS}")# NUMS = first;1;2;3;4;5;6# 7、SORT 排序list(SORT NUMS)message("NUMS =${NUMS}")# NUMS = 1;2;3;4;5;6;first# 8 删除最后一个元素list(POP_BACK NUMS)message("NUMS =${NUMS}")# NUMS = 1;2;3;4;5;6

2.7 CMake字符串命令string()

cmake 使用string()命令来操作字符串。

string(子命令 参数 …)子命令如下: LENGTH 返回字符串的长度 TOLOWER 将字符串转换为小写 TOUPPER 将字符串转换为大写 APPEND 在字符串末尾添加字符串 PREPEND 在字符串头部添加字符串 SUBSTRING 获取子字符串 STRIP 删除字符串前后的空格 CONCAT 将多个字符串连接在一起 FIND 查找一个字符串的索引位置 REPLACE 将字符串替换为给定字符串 REGEX MATCH 查找匹配一次正则表达式匹配的内容 REGEX MATCHALL 查找匹配全部正则表达式匹配的内容 REGEX REPLACE 替换匹配全部正则表达式匹配的内容 ASCII 将所有数字转换为相应的 ASCII 字符. HEX 将 ASCII 字符转换为十六进制数字

测试 string.cmake文件源码

cmake_minimum_required(VERSION3.11)# 定义一个字符串set(MyString"Hello World")message("原始字符串内容为:MyString =${MyString}")# MyString = Hello World# 测试字符串子命令# 字符串长度string(LENGTH${MyString}MyStringLength)message("MyStringLength =${MyStringLength}")# MyStringLength = 8# 字符串转为大写 MyStringUpper = MYSTRINGstring(TOUPPER${MyString}MyStringUpper)message("大写 MyString =${MyStringUpper}")# MyString = HELLO WORLD# 在字符串末尾添加元素string(APPEND MyString"!!")message("${MyString}")# Hello World!!# 获取子串,从索引2开始,长度为3为的子串,存放在substring中string(SUBSTRING${MyString}23substring)message("substring=${substring}")# substring=llo# 删除前后空格set(spacestring" hello world ")string(STRIP${spacestring}stripstring)message("stripstring=${stripstring}")# stripstring=hello world# 连接多个字符串set(str1"hello")set(str2" 你好")string(CONCAT str3${str1}${str2})message(str3=${str3})# str3=hello 你好# 查找字符串: 如果查找成功返回字符串索引,否则返回-1string(FIND${MyString}"World"index)message("index=${index}")# index=6# 查找正则表达式匹配内容set(s"a 1 a2 3a a456b")string(REGEX MATCHALL"a[0-9]+"result${s})# 匹配任意多个a+数字message("result=${result}")# result=a2;a456# 将数字转为ASCIIstring(ASCII65v)message("v=${v}")# v=A#将ASii码转换为十六进制string(HEX"A"v)message("HEX=${v}")# HEX=41

2.8 aux_source_directory()命令搜索目录下源文件

假设我们的项目中有很多源文件,那么来使用add_executable()添加可执行文件时,需要一个一个指定源文件,岂不是很麻烦? 比如有 a.c b.c c.c d.c e.c 那么使用add_executable(appexe a.c b.c c.c d.c e.c …) 这样一个一个添加,文件多时,添加文件就很麻烦了,有没有简单方法,一次性获取这么多文件呢?

2.8.1 自动搜索源文件

auxiliary 辅助的,使用aux_source_directory() 查找目录中(不包含子目录)的所有源文件,当向目录添加新文件时,必须手动重新运行 CMake 以生成包含新文件的构建系统。
语法格式:

aux_source_directory(<dir><variable>)dir指定要搜索的目录,比如当前目录,.variable 将查找到的源文件列表放到此变量中

2.8.2 测试

目录如下,有多个源文件和头文件,下面的目录中分别当前目录和子目录,寻找源文件和头文件。

cmake_minimum_required(VERSION3.14)project(testauxSourceDirectory)aux_source_directory(. DIR_SRCS)message(DIR_SRCS=${DIR_SRCS})# DIR_SRCS=./a.c ./b.c ./c.c ./d.c ./e.cc ./f.cpp ./g.cxx ./h.Caux_source_directory(./sub SUB_SRCS)message(SUB_SRCS=${SUB_SRCS})# SUB_SRCS=./sub/dd.c
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 6:14:52

HTTP 协议详解,HTTP 协议在真实运行环境中的表现差异

真正让我重新认真看 HTTP 协议&#xff0c;并不是在读 RFC 的时候&#xff0c;而是在一次接口问题排查中。 当时的问题并不复杂&#xff1a; 同一个接口&#xff0c;在不同网络环境下返回结果不一致&#xff1b;有时状态码正常&#xff0c;但客户端行为异常&#xff1b;有时服务…

作者头像 李华
网站建设 2026/4/22 8:20:09

【Hadoop+Spark+python毕设】天猫订单交易数据可视化分析系统、计算机毕业设计、包括数据爬取、数据分析、数据可视化、实战教学

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

作者头像 李华
网站建设 2026/4/23 3:26:12

python-flask-django基于Web的在线考试答题游戏的设计与实现_5o5sjig8

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 python-flask-django基于Web的在线考试答题游戏的设计与实现_5o5sjig8 项目技术简介 Pyth…

作者头像 李华
网站建设 2026/4/22 23:00:19

免费彻底解决找不到d3dx10_38.dll文件 无法运行软件和游戏问题

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/22 10:45:29

Mac_Linux 查询网站IP地址:4个核心命令详解

Mac/Linux 查询网站IP地址&#xff1a;4个核心命令详解 在日常开发、网络排查或学习过程中&#xff0c;我们经常需要知道某个网站对应的IP地址&#xff08;比如确认域名解析是否正常、判断访问延迟的原因等&#xff09;。在Mac和Linux系统下&#xff0c;无需安装额外工具&#…

作者头像 李华
网站建设 2026/4/23 17:04:05

ArcGIS大师之路500技---034重采样算法选择

文章目录前言1. 最邻近分配法&#xff08;Nearest Neighbor Assignment&#xff09;2. 双线性插值法&#xff08;Bilinear Interpolation&#xff09;3. 三次卷积插值法&#xff08;Cubic Convolution Interpolation&#xff09;4. 众数重采样法&#xff08;Mode Resampling / …

作者头像 李华