【CMake保姆级教程】定义变量、指定C++标准、指定输出路径

news2025/2/1 1:49:28

文章目录

  • 前言
  • 一、变量
    • 1.1 为什么需要变量?
    • 1.2 set的使用
    • 1.3 使用变量
  • 二、指定C++标准
    • 2.1 为什么需要指定C++标准?
    • 2.2 指定使用的C++标准
  • 三、指定输出路径
    • 3.1 为什么需要指定输出路径?
    • 3.2 设置输出路径
  • 总结


前言

CMake是一个强大的构建工具,它通过简化项目的构建和配置过程,使得跨平台开发变得更加容易。CMake使用简洁的语法和自动生成的构建文件,可以帮助开发者更轻松地管理和组织项目。在本教程中,我们将学习如何使用CMake定义变量、指定C++标准以及指定输出路径。


一、变量

1.1 为什么需要变量?

在CMake中,变量是存储数据的容器,它们用于传递信息、控制流程,以及配置构建过程。定义变量可以提高代码的可读性和可维护性,同时也方便在不同的地方共享相同的信息。通过变量,我们可以轻松地调整配置选项、文件路径等,从而适应不同的开发环境和需求。

1.2 set的使用

# SET 指令的语法是:
# [] 中的参数为可选项, 如不需要可以不写
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

在一个文件夹中,我们有下面这些文件

.
├── build
├── CMakeLists.txt
├── func.c
├── func.h
└── main.c

这2个源文件需要反复被使用,每次都直接将它们的名字写出来确实是很麻烦,此时我们就需要定义一个变量,将文件名对应的字符串存储起来,在cmake里定义变量需要使用set。

set(SRC_LIST main.c func.c)

比如像上面这样,前面为变量名,后面为你要赋的值

1.3 使用变量

如果你想使用变量,你需要这样${变量名}
如下所示:

cmake_minimum_required(VERSION 3.0.0)
project(test)

set(SRC_LIST main.c func.c)

add_executable(app ${SRC_LIST})
ubuntu@ubuntu-2204:~/C/csdn-cmake$ cd build/
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/C/csdn-cmake/build
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ make
[ 33%] Building C object CMakeFiles/app.dir/main.c.o
[ 66%] Building C object CMakeFiles/app.dir/func.c.o
[100%] Linking C executable app
[100%] Built target app
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ ./app
Hello CMake
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ 

可以看到,成功的cmake和make了

二、指定C++标准

2.1 为什么需要指定C++标准?

指定C++标准是为了确保项目在不同的编译器和平台上都能正确编译和运行。不同的C++标准包含了不同的语法和特性,开发者需要根据项目的需要选择合适的标准。通过在CMake中指定C++标准,我们可以保证代码在各种环境中的一致性。

2.2 指定使用的C++标准

在编写C++程序的时候,可能会用到C++11、C++14、C++17、C++20等新特性,那么就需要在编译的时候在编译命令中制定出要使用哪个标准:

$ g++ *.cpp -std=c++11 -o app

上面的例子中通过参数-std=c++11指定出要使用c++11标准编译程序,C++标准对应有一宏叫做DCMAKE_CXX_STANDARD。在CMake中想要指定C++标准有两种方式:
在 CMakeLists.txt 中通过 set 命令指定

#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)
在执行 cmake 命令的时候指定出这个宏的值
#增加-std=c++11
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
#增加-std=c++14
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=14
#增加-std=c++17
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=17

就像下面这样:

ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ cmake ../CMakeLists.txt -DCMAKE_CXX_STANDARD=11
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/C/csdn-cmake
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$

三、指定输出路径

3.1 为什么需要指定输出路径?

指定输出路径可以让我们更好地组织项目的构建结果。默认情况下,CMake会将可执行文件和库放在项目的构建目录中,但在实际项目中,我们可能希望将这些文件放在特定的文件夹中,以便更好地组织项目结构。

3.2 设置输出路径

在CMake中指定可执行程序输出的路径,也对应一个宏,叫做EXECUTABLE_OUTPUT_PATH,它的值还是通过set命令进行设置:

文件夹层级如下:

ubuntu@ubuntu-2204:~/C/csdn-cmake$ tree -L 1
.
├── bin
├── build
├── CMakeLists.txt
├── func.cpp
├── func.h
└── main.cpp

2 directories, 4 files
set(HOME /home/ubuntu/C/csdn-cmake/)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

第一行:定义一个变量用于存储一个绝对路径
第二行:将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
如果这个路径中的子目录不存在,会自动生成,无需自己手动创建
由于可执行程序是基于 cmake 命令生成的 makefile 文件然后再执行 make 命令得到的,所以如果此处指定可执行程序生成路径的时候使用的是相对路径 ./xxx/xxx,那么这个路径中的 ./ 对应的就是 makefile 文件所在的那个目录。

在这里插入图片描述
我们通过cmake和make就可以生成可执行程序了,如图所示


总结

通过本教程,我们学习了如何在CMake中定义变量、指定C++标准以及指定输出路径。这些功能使得项目的配置和构建变得更加简便和灵活。变量提供了一种在不同地方共享信息的方式,指定C++标准确保了项目在不同平台上的一致性,而指定输出路径则使得项目的构建结果更加有条理。希望这些知识能够帮助你更好地使用CMake管理和构建你的项目。

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

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

相关文章

WinRAR如何设置和清除密码?

WinRAR是一款功能强大的压缩管理器,除了能把文件打包变小,还能给压缩包设置密码保护,让文件不能随意打开,不需要时还可以把密码取消。下面来说说具体怎么操作吧。 WinRAR根据需要可以设置单次密码和永久密码,我们分别…

信息收集 - 谷歌hack

搜索引擎 FOFA网络空间测绘:https://fofa.info/ FOFA(FOcus on Assets)是一个网络空间搜索引擎,可以帮助用户快速定位和收集特定目标的信息。 ZoomEye:https://www.zoomeye.org ZoomEye 是一个网络空间搜索引擎,可以用于发现和收集特定目标的网络设备、Web应用程序、开放…

服务器加装了14T硬盘,显示不出来,戴尔R730阵列卡配置阵列RAID0

戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili 然后依据下面的视频进行操作,ctrlr,选raid0 戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili

Text2SQL学习整理(五)将Text-to-SQL任务与基本语言模型结合

导语 上篇博客:Text2SQL学习整理(四)将预训练语言模型引入WikiSQL任务简要介绍了两个借助预训练语言模型BERT来解决WIkiSQL数据集挑战的方法:SQLOVA和X-SQL模型。其中,借助预训练语言模型的强大表示能力,S…

vue3 element-plus 输入框 clearable属性 聚焦时宽度会变化

解决办法 因为你的代码中el-input是没有宽度的, 所以实际渲染出来的 el-input宽度 原生input宽度 前缀图标宽度 后缀图标宽度。 可以写css固定el-input宽度来处理。 :deep.el-input.el-input--default.el-input--suffix {// 固定宽度width: 200px !important; …

3年程序员开娱乐直播

今年就快结束了,愿你的梦想在2024年绽放,每一个努力都让你更接近自己的目标。 上海3年程序员,第一篇关于自己的博客,今天终于上手写了。 今年的大环境相信大家都很清楚了,降本增效这个一词弥漫在耳语之间,…

【ICCV2023】MMVP:基于运动矩阵的视频预测

目录 导读 本文方法 步骤1:空间特征提取 步骤2:运动矩阵的构造和预测 步骤3:未来帧的合成和解码 实验 实验结果 消融实验 结论 论文链接:https://openaccess.thecvf.com/content/ICCV2023/html/Zhong_MMVP_Motion-Matrix…

旅游海报图怎么做二维码展示?扫码即可查看图片

现在旅游攻略的海报可以做成二维码印刷在宣传单单页或者分享给用户来了解目的地的实际情况,出行路线、宣传海报等。用户只需要扫描二维码就可以查看内容,更加的方便省劲,那么旅游海报的图片二维码制作的技巧有哪些呢?使用图片二维…

白盒测试(超详细整理)

白盒测试 白盒测试(White Box Testing)又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程,而不测试软件产品的功能,用于纠正软件系统在描述、表示和规格上的错误&#xff0c…

销量影响因素分析:从多维度解析商品市场表现

在商品市场中,销量是衡量一个商品或品牌成功与否的关键指标。然而,销量的影响因素众多,包括产品品质、价格、品牌知名度、营销策略、竞争环境等。为了深入了解商品市场的表现,我们需要从多个维度对销量影响因素进行分析。本文将通…

群多多社群人脉H5-2.1.4多开插件+小程序独立前端+搭建教程

功能介绍: 1、群多多社群大全,是一个集发布、展示社群信息、人脉推广的裂变工具/平台。 2、通过人脉广场,将商家信息通过名片进行展示,让资源对接、人脉推广更加便捷高效。 3、行业群、兴趣群、知识付费群、交友群、商家活动推…

OPC UA 与PROFINET比较

ROFINET和OPC UA是两种常见的协议,过去这两个协议有两个不同的角色。PROFINET通常用于现场设备和本地控制器之间的实时数据通信。而OPC UA通常用于在本地控制器和更高级别的MES和SCADA系统之间进行通信。 OPC UA 网络架构 PROFINET网络由IO控制器和IO设备组成&…

企业出海-如何保护客户账户安全?

近年来国内企业竞争日益激烈,许多企业在这般环境下难以持续发展。那么该如何获得业务的可持续性增长,如何获取更多的客户的同时开阔公司的视野?出海便是如今帮助国内企业能快速发展壮大的潮流之一,摆脱了局限于国内发展的束缚奔向…

FasterRCNN目标检测

R-CNN 四个步骤: 对输入图片提取候选区(region proposal),每张大约2000个。论文中采用selective search的方法。对每个候选区采用CNN网络提取特征。此处需要将proposal的尺寸缩放成统一的227x227,以匹配CNN网络。最终提取到的特征…

基于ssm高校勤工助学系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装高校勤工助学系统软件来发挥其高效地信息处理的作用&#x…

YZ系列工具之YZ03:高版本Excel的自定义菜单

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套一部VBA手册,教程分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的…

深度学习 Day21——J1ResNet-50算法实战与解析

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU(如果使用的是CPU可以忽略这步)3.导入数据4.查…

初识nginx——内存池篇

为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼,值得我们学习,本文介绍内存池基本知识,nginx内存池的结构和…

Spring中你一定要知道的afterPropertiesSet()

文章目录 功能源码 功能 初始化bean执行的回调方法其一,它不像PostConstruct一样可以有多个,只能调用一次;它执行的时机是在PostConstruct之后,从它的名称也可以看出,他是在属性填充完,也就是bean初始化完…

Nginx快速入门:nginx各类转发、代理配置详解|location、proxy_pass参数详解(五)

0. 引言 咱们上节讲解了nginx的负载均衡配置,但是还有很多其他的转发情况,包括不同路径转发至不同的业务服务,通配符识别路径转发等。 今天一起来学习nginx的转发配置 1. location模块的匹配模式 首先我们要了解nginx进行转发代理的核心在…