CMake入门:3、变量操作 set 和 list

news2025/6/6 14:07:23

在 CMake 中,set 和 list 是两个核心命令,用于变量管理和列表操作。理解它们的用法对于编写高效的 CMakeLists.txt 文件至关重要。下面详细介绍这两个命令的功能和常见用法:

一、set 命令:变量定义与赋值

set 命令用于创建、修改或删除 CMake 变量。变量是 CMake 中存储数据的基本单元,可以存储字符串、数字、路径或列表。

1.基本语法
set(<变量名> <值>... [PARENT_SCOPE] [CACHE <类型> <文档字符串> [FORCE]])
2.常见用法
1)定义普通变量
set(PROJECT_NAME "MyProject")  # 定义项目名称
set(CMAKE_CXX_STANDARD 17)     # 设置 C++ 标准
2)定义列表变量

CMake 中没有专门的列表类型,列表用分号分隔的字符串表示:

set(SOURCE_FILES src/main.cpp src/module1.cpp src/module2.cpp)
# 等价于 SOURCE_FILES = "src/main.cpp;src/module1.cpp;src/module2.cpp"
3)缓存变量(Cache Variable)

缓存变量用于跨构建会话存储值(如编译选项),通常在第一次配置时设置:

set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries")
4)父作用域变量

默认情况下,变量作用域限于当前目录或函数。使用 PARENT_SCOPE 可将变量传递到父作用域:

function(SET_VERSION)
  set(VERSION "1.0.0" PARENT_SCOPE)
endfunction()
5)环境变量

使用 $ENV{VAR} 读取系统环境变量:

set(USERNAME $ENV{USER})  # 读取系统用户名

二、list 命令:列表操作

list 命令用于处理列表变量,提供了丰富的列表操作功能。

1.基本语法
list(<子命令> <参数>...)
2.常见子命令
1)APPEND:添加元素
list(APPEND SOURCE_FILES src/module3.cpp)
2)REMOVE_ITEM:删除元素
list(REMOVE_ITEM SOURCE_FILES src/module2.cpp)
3)FIND:查找元素位置
list(FIND SOURCE_FILES "src/main.cpp" INDEX)
# INDEX 为元素索引(从0开始),未找到时为 -1
4)SORT:排序
list(SORT SOURCE_FILES)
5)REVERSE:反转列表
list(REVERSE SOURCE_FILES)
6)GET:获取指定位置的元素
list(GET SOURCE_FILES 0 FIRST_FILE)  # 获取第一个元素
7)LENGTH:获取列表长度
list(LENGTH SOURCE_FILES COUNT)
8)SUBLIST:获取子列表
list(SUBLIST SOURCE_FILES 1 3 SUB_FILES)  # 获取索引1到3的子列表

三、set 与 list 的配合使用

set 和 list 通常结合使用来管理项目中的文件列表、编译选项等:

示例 1:管理源文件列表
# 初始化源文件列表
set(SOURCE_FILES src/main.cpp)

# 添加更多源文件
list(APPEND SOURCE_FILES 
  src/module1.cpp
  src/module2.cpp
)

# 排除测试文件(如果不需要)
list(REMOVE_ITEM SOURCE_FILES src/test.cpp)

# 使用列表创建可执行文件
add_executable(myapp ${SOURCE_FILES})
示例 2:处理编译选项列表
# 定义编译选项列表
set(COMPILE_OPTIONS -Wall -Wextra)

# 根据平台添加特定选项
if(WIN32)
  list(APPEND COMPILE_OPTIONS -DWIN32)
else()
  list(APPEND COMPILE_OPTIONS -DUNIX)
endif()

# 应用编译选项到目标
target_compile_options(myapp PRIVATE ${COMPILE_OPTIONS})

 四、注意事项

  1. 列表 vs. 字符串

    • CMake 中列表用分号分隔,例如 "a;b;c"
    • 使用 ${VAR} 展开变量时,若变量是列表,会自动展开为分号分隔的形式。
  2. 变量作用域

    • 函数内部定义的变量默认是局部的,使用 PARENT_SCOPE 或缓存变量可突破作用域限制。
  3. 缓存变量的特殊性

    • 缓存变量(CACHE)会保存在 CMakeCache.txt 中,除非使用 FORCE 选项,否则不会被重新设置。

五、小结

  • set:用于创建和管理变量,是 CMake 中最基本的赋值命令。
  • list:用于操作列表变量,提供了灵活的列表处理能力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VIN码车辆识别码解析接口如何用C#进行调用?

一、什么是VIN码车辆识别码解析接口 输入17位vin码&#xff0c;获取到车辆的品牌、型号、出厂日期、发动机类型、驱动类型、车型、年份等信息。无论是汽车电商平台、二手车商、维修厂&#xff0c;还是保险公司、金融机构&#xff0c;都能通过接入该API实现信息自动化、决策智能…

Playwright 测试框架 - Java

🚀【Playwright + Java 实战教程】从零到一掌握自动化测试利器! 🔧 本文专为 Java 开发者量身打造,通过详尽示例带你快速掌握 Playwright 自动化测试。涵盖基础操作、表单交互、测试框架集成、高阶功能及常见实战技巧,适用于企业 UI 测试与 CI/CD 场景。 🛠️ 一、环境…

力扣100题之128. 最长连续序列

方法1 使用了hash 方法思路 使用哈希集合&#xff1a;首先将数组中的所有数字存入一个哈希集合中&#xff0c;这样可以在 O(1) 时间内检查某个数字是否存在。 寻找连续序列&#xff1a;遍历数组中的每一个数字&#xff0c;对于每一个数字&#xff0c; 检查它是否是某个连续序列…

算法打卡12天

19.链表相交 &#xff08;力扣面试题 02.07. 链表相交&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交**&#xff1a;** 题目数据…

蓝桥杯国赛训练 day1 Java大学B组

目录 k倍区间 舞狮 交换瓶子 k倍区间 取模后算组合数就行 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {solve();}public static vo…

PyTorch——非线性激活(5)

非线性激活函数的作用是让神经网络能够理解更复杂的模式和规律。如果没有非线性激活函数&#xff0c;神经网络就只能进行简单的加法和乘法运算&#xff0c;没法处理复杂的问题。 非线性变化的目的就是给我们的网络当中引入一些非线性特征 Relu 激活函数 Relu处理图像 # 导入必…

OPenCV CUDA模块目标检测----- HOG 特征提取和目标检测类cv::cuda::HOG

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::HOG 是 OpenCV 的 CUDA 模块中对 HOG 特征提取和目标检测 提供的 GPU 实现。它与 CPU 版本的 cv::HOGDescriptor 类似&#xff0c;但利…

MATLAB读取文件内容:Excel、CSV和TXT文件解析

MATLAB读取文件内容&#xff1a;Excel、CSV和TXT文件解析 MATLAB 是一款强大的数学与工程计算工具&#xff0c;广泛应用于数据分析、模型构建和图像处理等领域。在处理实际问题时&#xff0c;我们常常需要从文件中读取数据进行分析。本文将介绍如何使用 MATLAB 读取常见的文件…

Spring MVC 之 异常处理

使用Spring MVC可以很灵活地完成数据的绑定和响应&#xff0c;极大的简化了Java Web的开发。但Spring MVC提供的便利不仅仅如此&#xff0c;使用Spring MVC还可以很便捷地完成项目中的异常处理、自定义拦截器以及文件上传和下载等高级功能。本章将对Spring MVC提供的这些高级功…

ubuntu24.04 使用apt指令只下载不安装软件

比如我想下载net-tools工具包及其依赖包可以如下指令 apt --download-only install net-tools 自动下载的软件包在/var/cache/apt/archives/目录下

计算机网络安全问答数据集(1788条) ,AI智能体知识库收集! AI大模型训练数据!

继续收集数据集&#xff0c;话不多说&#xff0c;见下文&#xff01; 今天分享一个计算机网络安全问答数据集&#xff08;1788条)&#xff0c;适用于AI大模型训练、智能体知识库构建、安全教育系统开发等多种场景&#xff01; 一、数据特点 结构清晰&#xff1a;共计1788条&…

WinCC学习系列-高阶应用(WinCC REST通信)

WinCC作为一个经典SCADA系统&#xff0c;它是OT与IT数据无缝集成桥梁&#xff0c;自WinCC7.5版本开始&#xff0c;可以直接提供Rest服务用于其它系统数据访问和操作。 WinCC REST 服务允许外部应用程序访问 WinCC 数据。 外部应用程序可以通过 REST 接口读取和写入 WinCC 组态…

使用交叉编译工具提示stubs-32.h:7:11: fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法

0 前言 使用ST官方SDK提供的交叉编译工具、cmake生成Makefile&#xff0c;使用make命令生成可执行文件提示fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法&#xff0c;如下所示&#xff1a; 根据这一错误提示&#xff0c;按照网上的解决方案逐一尝试均以失败告…

macOS 连接 Docker 运行 postgres,使用navicat添加并关联数据库

下载 docker注册一个账号&#xff0c;登录 Docker创建 docke r文件 mkdir -p ~/.docker && touch ~/.docker/daemon.json写入配置&#xff08;全量替换&#xff09; {"builder": {"gc": {"defaultKeepStorage": "20GB",&quo…

指针的使用——基本数据类型、数组、结构体

1 引言 对于学习指针要弄清楚如下问题基本可以应付大部分的场景&#xff1a; ① 指针是什么&#xff1f; ② 指针的类型是什么&#xff1f; ③ 指针指向的类型是什么&#xff1f; ④ 指针指向了哪里&#xff1f; 2 如何使用指针 任何东西的学习最好可以总结成一种通用化的…

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…

【Linux】Linux 环境变量

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125533127 一、环境变量 1.1 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&am…

OpenCV在图像上绘制文字示例

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 OpenCV中除了提供绘制各种图形的函数外&#xff0c;还提供了一个特殊的绘制函数&#xff0c;用于在图像上绘制文字。这个函数是putText()&#xff0c;它是命名空间cv中的函数&#xff0c;其声明如下&#xff…

为什么要选择VR看房?VR看房有什么优点?

VR看房&#xff1a;革新传统&#xff0c;重塑体验 在当今社会&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正以前所未有的速度渗透到我们生活的各个领域&#xff0c;其中VR看房作为房地产领域的重要创新。本文将讨论为什么要选择VR看房以及VR看房的主要优点&#xff0…

pytorch基本运算-范数

引言 前序学习进程中&#xff0c;已经对pytorch基本运算有了详细探索&#xff0c;文章链接有&#xff1a; 基本运算 广播失效 乘除法和幂运算 hadamard积、点积和矩阵乘法 上述计算都是以pytorch张量为运算元素&#xff0c;这些张量基本上也集中在一维向量和二维矩阵&#x…