CMAKE变量与选择详解

news2024/11/24 10:17:31

目录

在 CMake 中,变量和选项是:

CMake中的变量:

接下来是一个cmake的案例:

在CMake中定义和使用函数:



 

在 CMake 中,变量和选项是:

  1. 变量(Variables):

    • CMake 中的变量使用 set() 命令进行设置。可以使用变量来存储字符串、路径、数字等信息。
    • 例如,使用 set(MY_VARIABLE "Hello") 设置一个名为 MY_VARIABLE 的变量,并将其值设为 "Hello"
    • 可以使用 ${MY_VARIABLE} 的形式引用变量的值,例如在 add_definitions() 中使用 ${MY_VARIABLE} 添加定义。
    • 变量还可以通过 CACHE 关键字进行缓存,使其在多次运行 CMake 时保持持久。
  2. 选项(Options):

    • CMake 中的选项用于控制项目的不同行为和特性。
    • 使用 option() 命令定义一个选项,并设置其默认值和描述信息。
    • 例如,使用 option(ENABLE_FEATURE_A "Enable Feature A" ON) 定义一个名为 ENABLE_FEATURE_A 的选项,默认为开启。
    • 可以使用 if() 来检查选项的状态,根据不同的选择执行不同的操作。

示例:

# 定义一个变量
set(MY_VARIABLE "Hello")

# 引用变量的值
add_definitions(-DMESSAGE="${MY_VARIABLE}")

# 定义一个选项
option(ENABLE_FEATURE_A "Enable Feature A" ON)

# 根据选项的状态执行不同的操作
if(ENABLE_FEATURE_A)
    add_definitions(-DFEATURE_A)
else()
    add_definitions(-DFEATURE_B)
endif()

通过使用变量和选项,你可以灵活地控制项目的配置和行为,例如开启或关闭特定的功能、设置不同的编译选项等。这使得你能够根据不同的环境和需求对项目进行自定义和适应。

CMake中的变量:

是用于存储值的名称,可以是字符串、数字、列表或布尔值。CMake中的变量分为两种类型:缓存变量和普通变量。缓存变量可以在多次CMake运行中保持不变,可以通过cmake-gui或者命令行工具来修改它们的值。普通变量只在CMake运行时有效,CMake运行结束后就被销毁。

在CMake中,可以使用set命令来定义变量,例如:

Copy

set(MY_VARIABLE "Hello World")

CMake还提供了一些控制流命令,例如if和elseif,可以用于根据变量的值来进行条件判断和选择。例如,可以使用if命令来检测变量是否存在或是否等于某个值:

if(MY_VARIABLE)
   message("MY_VARIABLE is defined")
else()
   message("MY_VARIABLE is not defined")
endif()

if(MY_VARIABLE STREQUAL "Hello World")
   message("MY_VARIABLE is set to Hello World")
endif()

此外,CMake还提供了一些其他的变量操作命令,例如foreach、while、list等,可以用于遍历、操作和处理变量中的数据。总的来说,CMake的变量和选择机制非常灵活,可以方便地实现各种构建和配置需求。

接下来是一个cmake的案例:

一个使用CMake变量的例子是在项目中定义和使用一个版本号变量。版本号通常用于标识软件的不同版本和发布,也可以用于控制不同版本的构建选项和依赖。在CMake中,可以使用set命令来定义版本号变量,例如:

set(MY_PROJECT_VERSION_MAJOR 1)
set(MY_PROJECT_VERSION_MINOR 0)
set(MY_PROJECT_VERSION_PATCH 0)
set(MY_PROJECT_VERSION "${MY_PROJECT_VERSION_MAJOR}.${MY_PROJECT_VERSION_MINOR}.${MY_PROJECT_VERSION_PATCH}")

上述代码定义了三个整数变量和一个字符串变量,分别表示主版本号、次版本号、修订版本号和完整的版本号。可以使用${}语法来引用变量值,例如:

message("My project version is ${MY_PROJECT_VERSION}")

此外,还可以使用configure_file命令将版本号变量写入到源代码文件中,例如:

configure_file(version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h)

这将会根据模板文件version.h.in生成一个version.h文件,其中包含了定义的版本号变量。在程序中可以直接引用version.h文件来获取版本号信息。

在CMake中定义和使用函数:

在CMake中,可以使用function命令来定义和使用函数。函数可以用于封装一些常见的操作或者流程,以简化CMake脚本的编写和维护。下面是一个简单的示例,演示了如何定义和使用一个函数:

# 定义一个函数
function(my_function arg1 arg2)
  message("arg1 = ${arg1}")
  message("arg2 = ${arg2}")
endfunction()

# 调用函数
my_function("Hello" "World")

在上述示例中,function命令定义了一个名为my_function的函数,该函数有两个参数arg1和arg2。函数体中使用message命令输出了两个参数的值。接着使用my_function命令调用了该函数,并传递了两个参数"Hello"和"World"。在运行CMake时,将会输出如下内容:

arg1 = Hello
arg2 = World

除了基本的参数传递,函数还可以返回值。可以使用return命令来返回一个值,例如:

function(add a b)
  math(EXPR result "${a} + ${b}")
  return(${result})
endfunction()

set(sum_result 0)
add(3 5)
set(sum_result ${result})
message("The sum of 3 and 5 is ${sum_result}")

在上述示例中,add函数将两个参数相加,并使用return命令返回结果。在调用add函数时,可以将返回值保存到一个变量中,以便后续使用。

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

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

相关文章

chatgpt赋能python:Python函数查看快捷键:不可或缺的工具

Python函数查看快捷键:不可或缺的工具 Python是一门流行的编程语言,是数据分析、机器学习、人工智能等各种领域的首选语言。对于有10年Python编程经验的开发人员来说,Python函数查看快捷键可能是最熟悉的工具之一。因此,本篇文章…

k8s部署docker

1 环境准备 操作系统:centos7.9_x64 Docker:20-ce K8s:1.23 操作系统最小硬件配置(在vmmare安装时需要选择):2核CPU、2G内存、20G硬盘 k8s-master:192.168.88.191 k8s-node1:192.…

chatgpt赋能python:Python冒泡排序算法详解

Python冒泡排序算法详解 介绍 冒泡排序是一种简单但相对较慢的排序算法。这个算法会重复地遍历要排序的数列,每次比较两个元素,如果它们的顺序错误就交换它们的位置,直到没有任何一对元素需要交换为止。这个算法由于排序过程中最大元素就像…

怎么用Excel VBA写一个excel批量合并的程序?

您可以按照以下VBA代码来实现把同一路径上的所有工作簿合并到同一个工作簿中: VBA Option Explicit Sub MergeWorkbooks() Dim path As String, fileName As String, sheet As Worksheet Dim targetWorkbook As Workbook, sourceWorkbook As Workbook Dim workshe…

建立可重复使用的自动测试过程

建立可重复使用的自动测试过程 在软件开发领域,自动化测试已经成为必不可少的一部分,它可以提高软件产品的质量、减少错误率、加快测试时间。但是,为了让自动测试过程更加高效和可重复使用,需要建立一套稳定的自动化测试框架。 自…

ES6: 模板字符串和箭头函数的基本使用

前言 本文主要介绍了ES6中模板字符串和箭头函数的基本使用 一、模板字符串 1、基本介绍 由反引号(在键盘Esc键的下面)圈住的字符串即模板字符串举例: //普通字符串 const namehello console.log(name)//模板字符串 const name1world console.log(na…

前端js实现将数组某一项符合条件的对象,放到首位

哈喽 大家好啊 在日常前端开发需求中,总是会遇到开发数组,将某一项对象值,放到首位,让用户更好的去选择,比如省会城市优先等 我做的案例是需要将地区中的四川放到首位 以下是我的代码: 简单说明下思路&a…

蓝桥杯单片机PCF8591芯片ADC与DAC运行冲突解决

单片机型号:STC15F2K60S2 目录 文章附上工程下载地址: 在进行ADC与DAC测试时发现了如下冲突: 实验问题发现: 解决方案: 文章附上工程下载地址: https://download.csdn.net/download/qq_64257614/87854…

OpenWrt 安装“Alist 文件列表”挂载云盘

警告天翼云盘上传受限每天只有2GB 警告天翼云盘上传受限每天只有2GB 警告天翼云盘上传受限每天只有2GB 前言(背景故事,没有干货) 此前一直在用“阿里云盘-WebDAV”,用起来也挺好非常的方便,直到最近接触到“天翼云盘…

动态调整xxl_job下次执行时间

项目场景: 目前项目引入了 xxl-job 来跑定时任务,但是存在一个问题,项目执行结束的时间不固定,有峰值,在高峰期的时候会出现长阻塞一直排队等待,如图: 问题描述 需要做一种策略来解决长阻塞问…

区块链理财源码【互联网畜牧业养牛平台】带积分商城+抽奖+会员特权【亲测】

源码简介: 互联网畜牧业的养牛平台,非常火的区块链农业应用,是养殖业元宇宙的一种理财商业模式,农业类的其实都可以借鉴这种思路。当然了,玩法比较多样,不要做违法的事情就行。 代码已经简单亲测了一下&a…

linuxOPS基础_linux文本文件查看及统计

vi/vim vim文档编辑操作太多了,可以看这篇单独介绍vim的文章>https://blog.csdn.net/weixin_44368963/article/details/130963920 cat查看文件 命令:cat 作用:查看文件内容 语法:#cat 文件名称 ​ #cat 文件1 文件2 > 文件3 **特别注…

docker入门(1)----服务/镜像/容器/数据卷相关命令

安装 官网安装app命令行安装(但是没有图形界面app)brew install docker 架构 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像ubuntu:16.04 就包含了…

chatgpt赋能python:Python内置排序:快速高效的数据处理方式

Python内置排序:快速高效的数据处理方式 作为一种非常流行的编程语言,Python提供了很多高效、易于使用的内置功能,其中之一就是排序函数。通过使用内置的排序函数,Python工程师可以快速高效地处理各种不同类型的数据,…

什么是DAS/SAN/NAS

先上图 DAS DAS(Direct-attached Storage) 直连存储,这种存储设备通常是一个磁盘阵列柜,里面有多块磁盘,但不带RAID功能。 它与服务器主机之间的连接通常采用SCSI或者FC连接。DAS只能连接一台服务器,其它服务器无法共享该存储。 …

Redisson

文章目录 Redisson背景简介使用引入依赖配置类源代码 Redisson 背景 基于Redis(setnx)实现的分布式锁存在以下几个问题: 不可重入:同一个线程无法多次获取同一把锁 不可重试:获取锁只尝试一次就返回false,没有重试机制 超时释…

云服务器+minio+PicGo+Typora搭建个人图床实现typora鼠标右击上传图片。

搭建图床 服务器配置docker安装minio安装配置docker安装minio配置minio picgo配置下载picgopicgo配置去插件市场下载,minio配置 typora配置安装破解设置上传服务 服务器配置 本人用的是阿里云的轻量型云服务器,centos7.6,没有服务器的可以自…

让文物“活”起来,火山引擎视频云三维重建技术揭秘

动手点关注 干货不迷路 中国历史悠久,文化底蕴深厚,文物数目众多,文物作为前人智慧的结晶,其文献价值不言而喻。古籍是记录中华文明的重要载体,也是流传至今的宝贵文化遗产,文物保护也是一项长期重要的基础…

OpenAI最新研究Let's verify step-by-step,过程胜于结果!

深度学习自然语言处理 原创作者&#xff1a;Winni OpenAI最新研究 <Let’s verify step-by-step> 于昨天发布&#xff0c;引起了广泛关注。这个想法非常简单&#xff0c;可以用一句话来概括&#xff1a; 对于复杂的逐步推理问题&#xff0c;我们在每个步骤都给予奖励&…

用GANs来做数据增强

适用于只有很少样本的情况。 即使是不完美的合成数据也可以提高分类器的性能。 生成对抗网络(Generative adversarial networks&#xff0c;简称GANs)由Ian Goodfellow于2014年推出&#xff0c;近年来成为机器学习研究中非常活跃的话题。GAN是一种无监督生成模型&#xff0c;它…