首页 > 其他分享 >CMake学习(二)

CMake学习(二)

时间:2024-07-27 23:19:57浏览次数:11  
标签:BeginnerConfig CMake C++ 学习 VERSION CMAKE txt

CMake(二)

1、C++标准指定

CMake 有一些特殊的变量,它们有的是在底层创建的,或者是在项目代码设置时对 CMake 有意义的,其中许多变量以 CMAKE_ 开头的
在我们自己声明配置变量时,需要尽可能避免采用这种命名方式

在这些特殊的变量中,包含有2个比较常用的,CMAKE_CXX_STANDARDCMAKE_CXX_STANDARD_REQUIRED,这二者经常一同使用,来指定用来构建项目的C++标准

这里为了使用方便,直接换了“最强IDE”——Visual Studio,直接把之前的目录导入给它,它可以识别出CMake项目
在这里插入图片描述
这样省去敲命令行,比较方便
接下来修改下我们的main.cpp文件,添加一个C++17的特性

#include<iostream>

// C++17新特性
inline int globalVar = 42;

int main()
{
	std::cout << "Hello, CMake!" << std::endl;
}

接下来修改CMakeLists.txt,添加C++版本配置的内容

# 指定最低支持的CMake版本
cmake_minimum_required(VERSION 3.10)
# 指定编译使用C++标准
set(CMAKE_CXX_STANDARD 11)
# 启用支持以上指定C++标准
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 设置项目名称
project(Beginner)
# 将指定源文件编译成可执行文件
add_executable(App main.cpp)

在这里插入图片描述
这两行配置都要写在add_executable()之前
表示的意思就是我们强制指定项目使用C++11标准,此时C++17的特性注定会报错,我们保存下,回去看下刚刚的代码
在这里插入图片描述
此时编译报错了,我们回去把C++11改为C++17
在这里插入图片描述
现在程序没有报错了
在这里插入图片描述
值得注意的是,Visual Studio可以直接关联到配置的可执行文件,可以如下勾选,直接进行执行
在这里插入图片描述

2、获取CMakeLists.txt的参数

有的时候,我们也希望在 CMakelists.txt 文件中定义的变量也可以在源代码中使用,就比如我们希望在代码中打印项目的版本

其中的一种实现方式是使用配置头文件。我们创建一个输入文件,其中包含一个或多个要替换的变量。这些变量有特殊的语法,形如 @VAR@
然后,我们使用 configure_file() 命令将输入文件复制到给定的输出文件,并用 CMakelists.txt 文件中 VAR 的当前值替换这些变量

可能类似于填表,给你一张表,上面告诉你要填什么,然后最终输出的是对应填完的内容

我们来改一下CMakeLists.txt文件,添加版本号信息
在这里插入图片描述
在这里插入图片描述
project() 会根据入参在底层存储对应的值,因此通过PROJECT_VERSION或者Beginner_VERSION应该都可以引用到版本号的值

接下来,我们需要新创建一张需要填空的模板,标注需要的变量,这个文件为BeginnerConfig.h.in

#define APP_VERSION_MAJOR @Beginner_VERSION_MAJOR@
#define APP_VERSION_MINOR @Beginner_VERSION_MINOR@
#define APP_VERSION_PATCH @Beginner_VERSION_PATCH@

添加configure_file()BeginnerConfig.h.in的内容拷贝给BeginnerConfig.h,当然,此时已经有具体的内容了
在这里插入图片描述
最终生成的配置文件会在项目构建目录,因此需要使用target_include_directories()指定查找文件的位置,注意需要在生成目标文件后才可以,默认会到App.exe生成的目录下
在这里插入图片描述
接下来,我们在main.cpp中进行引用

#include<iostream>
#include "BeginnerConfig.h"   // 生成的输出文件,作为头文件

int main()
{
	std::cout << "Hello, " << APP_VERSION_MAJOR << "." << APP_VERSION_MINOR << "." << APP_VERSION_PATCH << std::endl;
	getchar();
}

此时,看下全部的CMakeLists.txt配置内容,确认一下

# 指定最低支持的CMake版本
cmake_minimum_required(VERSION 3.10)
# 指定编译使用C++标准
set(CMAKE_CXX_STANDARD 17)
# 启用支持以上指定C++标准
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 设置项目名称
project(Beginner  VERSION 1.0.0)
# 拷贝配置
configure_file(BeginnerConfig.h.in BeginnerConfig.h)
# 将指定源文件编译成可执行文件
add_executable(App main.cpp)
# 查找文件的目录
target_include_directories(App PUBLIC "${PROJECT_BINARY_DIR}")

执行后,可以看到CMakeLists.txt中配置的版本信息已经被代码成功获取到了
在这里插入图片描述
我们自己项目里现在就这几个文件
在这里插入图片描述
而获取的内容在CMake为我们生成的这个头文件中
在这里插入图片描述
Visual Studio的解决方案管理器里显示的不是全部内容,通过进入文件管理器,可以看到,BeginnerConfig.h出现在我们的可执行文件目录下,这便是我们最后包含的目录
在这里插入图片描述
通过这种方式,我们实现了从配置文件中获取参数

在实际的开发中,也是建议将版本号像这样放在配置文件中,而不是直接写在代码中,便于管理和查阅,防止代码修改

标签:BeginnerConfig,CMake,C++,学习,VERSION,CMAKE,txt
From: https://www.cnblogs.com/mint-garden/p/18327684

相关文章

  • Verilog编程学习之—呼吸灯
    Verilog编程-呼吸灯1.设计目标用FPGA产生占空比变化的PWM波,控制LED灯由暗变亮的变化。2.设计思路设置PWM波的步长为2us,周期为2ms,每个周期内LED亮的时间由0增加至999,再从999减少至0,依次循环,就可以看到LED灯由暗变亮再由亮变暗的循环过程。可以设置一个占空比寄存器duty_r和一个......
  • CMake学习(一)
    CMake学习(一)1、简介CMake是一个强大的软件构建系统,可以用简单的语句来描述所有平台的安装(编译过程)可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档https://cmake.org/2、构建基础项目最基础的CMake项目是由单个源代码文件构建的可执行......
  • 《昇思25天学习打卡营第7天|函数式自动微分》
    函数式自动微分神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(lossfunction)获得loss,然后进行反向传播计算,求得梯度(gradients),最终更新至模型参数(parameters)。自动微分能够计算可导函数在某点处的导数值,是反向传播算法的一般化。自动微分......
  • 《昇思25天学习打卡营第5天|数据变换 Transforms》
    数据变换Transforms通常情况下,直接加载的原始数据并不能直接送入神经网络进行训练,此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换(Transforms),配合数据处理Pipeline来实现数据预处理。所有的Transforms均可通过map方法传入,实现对指定数据列的处理......
  • 学习c语言第十五天(初阶测评)
    选择题1.下列程序输出结果为672.下列程序输出结果为 死循环打印3.i和j的值分别为什么 214.k的终值是什么905.输出结果是什么 16.正确的是    C7.C语言规定main函数位置    C8.不正确的是    D9.正确的是     c ......
  • [rCore学习笔记 018]实现特权级的切换
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有本节内容因为risc-v存在硬件特权级机制,我们又要实现一个可以使得应用程序工作在用户级,使得操作系统工作在特权级.原因是要保证用户态的......
  • 每周Java学习汇总
    字符串(String):在Java中,字符串是一个非常重要的数据类型。它是不可变的,意味着一旦创建,就不能更改其内容。字符串可以用双引号(“”)表示。Java提供了许多处理字符串的方法,如拼接、截取、查找、替换等。自增自减运算符(++和--):自增运算符(++)和自减运算符(–)用于对变量进行加1或减1的操......
  • java学习进程4
    在这一周的学习中,我主要集中在Java编程的基础知识及其核心概念的理解上。以下是我本周所做的一些具体活动:本周学习活动面向对象编程(OOP)基本概念:本周我深入学习了面向对象编程的基本概念,了解了类、对象、属性和方法的定义及其在Java中的应用。同时也理解了对象如何通过......
  • Java学习第四周
    /**测试条件(三元)连接符的用法*/publicclassTestOperator06{publicstaticvoidmain(String[]args){intscore=90;Stringa=score<60?"不及格":"及格";System.out.println(a); if(score<60){ a="不及格"; }else{ a="及格"; } i......
  • 第四周学习报告
    又经过了一周的学习,今天对本周学习进行总结本周学习了面向对象和字符串的相关知识面向对象类和对象类的定义通过关键字class来定义classMyClass{//属性intnumber;Stringname;//方法voiddisplay(){System.out.println......