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

文章目录

  • 前言
  • 一、变量
    • 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.cpp2 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.mzph.cn/news/238661.shtml

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

相关文章

【虹科分享】金融服务急需数据层改造

文章速览: 数字化转型正在颠覆银行与金融业金融服务的未来Redis Enterprise赋能实时金融应用 金融服务越来越注重实时互动体验,重构关键业务流程,从数据层入手该怎么做? 一、数字化转型正在颠覆银行与金融业 金融科技行业的初创…

网络技术基础与计算思维实验教程_4.2_静态路由项配置实验

实验内容 实验目的 实验原理 关键命令 实验步骤 构建 安装完成以后 可以看到路由器有三个快速以太网接口 为3安装 分别构建两个以太网 用交叉线连接router1和2 配置IP地址 完成配置过程 查看路由表 根据路由表添加 现在可以实现PC0和PC1之间的ICMP报文传输 Router(config)#…

虾皮跨境电商物流:打造高效便捷的全球供应链解决方案

随着全球化的推进和电子商务的蓬勃发展,跨境电商物流成为了越来越多商家和消费者关注的焦点。虾皮(Shopee)作为一家领先的电商平台,不仅提供了丰富多样的商品选择,还致力于为卖家和消费者提供高效便捷的跨境电商物流服…

@vue/cli脚手架

0_vue/cli 脚手架介绍 目标: webpack自己配置环境很麻烦, 下载vue/cli包,用vue命令创建脚手架项目 vue/cli是Vue官方提供的一个全局模块包(得到vue命令), 此包用于创建脚手架项目 脚手架是为了保证各施工过程顺利进行而搭设的工作平 vue/cli的好处 开箱即用 0配置webpack babe…

STL中优先队列(堆)的详解

文章目录 priority_queue的基本介绍堆(heap)堆的概念与结构 priority_queue 的介绍与使用 priority_queue的基本介绍 这个priority_queue翻译成中文就是优先级队列,但其实我们很难去一眼看出他的意思到底是什么,他的逻辑结构实际上类似于数据结构中的堆…

[NISACTF 2022]easyssrf

[NISACTF 2022]easyssrf wp ssrf 的题目,提示了会使用 curl 连接输入的网站并返回响应包。 测试连接百度 直接在输入框中写 www.baidu.com 是无法连接的,需要在前面加入 http 或者 https ,因为 curl 的使用方式就是: curl htt…

VS Code配置C语言环境

首先安装一个C语言的编译器,然后将其位置添加到系统环境变量中。(之后需要重启一下vs,才能检测到编译器) 打开vscode下载4个插件: C/C Extension PackCode RunnerInclude AutocompleteCMake Tools 然后打开设置把三个选项勾上。…

cad x命令炸开图纸怎么恢复?

cad x命令炸开图纸怎么恢复?cad图纸使用x命令炸开后,想要组合在一起,该怎么操作呢?下面我们就来看看cad炸开命令的详细使用教程 今天我们主要解决在cad中用x炸开后恢复的问题,当然附带一些基础知识也一起普及一下。 …

Python中实现消息队列:构建高效异步通信系统的完整指南

更多资料获取 📚 个人网站:ipengtao.com 消息队列的基础概念 在开始之前,先了解一些消息队列的基础概念。 1 什么是消息队列? 消息队列是一种通信方式,它允许将消息从一个应用程序传递到另一个应用程序。消息队列提…

目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估

Hi, I’m Shendi 1、目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估 在最近有了个物体识别的需求,于是开始学习 在一番比较与询问后,最终选择 TensorFlow。 对于编程语言,我比较偏向Java或nod…

多切片联合构建3D生物空间图谱

空间转录组(ST,Spatial transcriptomics)技术正在革新探索组织空间结构的方式。目前,ST数据分析通常仅限于单个2D组织切片,限制了我们理解3D空间中发生的生物过程。在这里,作者提出了STitch3D,一…

SpringIOC之LocaleContext

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

Sublime Text 3配置 C# 开发环境

Sublime Text 3配置 C# 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 C#3. 接入 .NET Framework3.1 下载 .NET Framework3.2 环境变量配置 4. 配置 C# 开发环境5. 编写 C# 代码6. 运行 C# 代码 三、总结 一、引言 C# 是一种面向对象的编程语言,由微…

100GPTS计划-AI文章扩展ContentExpander

地址 https://chat.openai.com/g/g-jPr6gWUI9-content-expander https://poe.com/ContentExpander 测试 微调 内容扩展器专门用于扩展小说相关文本 上下文微调 保证小说基本风格

【收藏】法律人办案必备检索网站最新汇总!附检索技巧

为什么要进行法律检索?无论你擅长的是做诉讼还是非诉讼业务,法律检索都是必备技能之一。只有做好法律检索才能制定出更加完备的策略报告,才能提供更加充实、可行、准确的方案。 一、数据库检索 1、alpha数据库 https://www.icourt.cc 已经用了3年的大数据库,听说最近降价了…

Unreal5.3 PCG 笔记

目录 ElectricDreams场景功能移动中间山体向周围随机生成倒下的树干树干上随机生成的植被 ElectricDreams场景功能 移动中间山体向周围随机生成倒下的树干 配置内容 中心山体Spline周围沟渠Spline(土堆)PCG规则 主要功能节点 SplineSample(…

大创项目推荐 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…

只知道短视频和直播带货?抖店好像更适合我们普通人哦!项目介绍

我是王路飞。 说道带货,大多数人还是只知道抖音短视频和抖音直播带货。 毕竟,现在众多平台都在往电商方向发展,做电商的方式就是通过短视频和直播的形式带货。 但是,很明显不是所有人都能去做的,尤其是对我们这些普…

亚马逊品牌分析ABA功能有哪些?亚马逊选品的量化标准有哪些?——站斧浏览器

亚马逊品牌分析ABA功能有哪些? 1、品牌市场份额(Share of Voice) ABA提供了品牌在特定类别中市场份额的详细数据。这一模块帮助品牌所有者准确评估其品牌在整个市场中的竞争地位和表现。通过了解市场份额,品牌方可以制定更具针对…

GEOPHYSICS 投稿须知

2018 年 1 月生效的 GEOPHYSICS 文章撰写和格式化指南已修订,并包括支持双重匿名评审的新要求。 一、范围和编辑政策 数据和材料可用性:在投稿过程中,作者被要求说明是否有重现论文中报告的结果所需的数据。 与本研究相关的数据可用&#x…