CMake 教程跟做与翻译 2
目录
STEP 1(Extra A):指定C++的版本
STEP1(Extra B): 为我们的项目添加版本信息与配置的头文件
Reference
STEP 1(Extra A):指定C++的版本
有的时候,我们会是对一个比较年老的项目进行构建。这个时候,我们可能就需要限制一下使用的C/C++的版本(比如说使用的是C++98)来进行编译;或者,我们的项目很潮,使用的是C++17以上的版本,这个时候限制就显得更为必要了(一些新的特性需要新版本支持)。我们就需要作出限制。
在这里,我们需要使用到的就是:
CMAKE_CXX_STANDARD # CMake里的C++标准变量 CMAKE_CXX_STANDARD_REQUIRED # CMake里的一个BOOL变量,用于指示是否强迫版本 set() # 设置这些变量使用到的CMake函数
当然,我们只需要在CMakeLists.txt中,在project的下方和add_executable函数的上方加入
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)
这就表达了我们需要强制使用C++11编译本项目的意思!
STEP1(Extra B): 为我们的项目添加版本信息与配置的头文件
有时,让 CMakelists.txt 文件中定义的变量在源代码中可用可能会很有用。在这种情况下,我们想打印项目版本。实现此目的的一种方法是使用已配置的头文件。我们创建一个包含一个或多个要替换的变量的输入文件。这些变量具有特殊的语法,看起来像 @VAR@。然后,我们使用 configure_file() 命令将输入文件复制到给定的输出文件,并用 CMakelists.txt 文件中 VAR 的当前值替换这些变量。
虽然我们可以直接在源代码中编辑版本,但最好使用此功能,因为它可以创建单一事实来源并避免重复。
项目的版本信息很容易添加,我在上一篇就说到了:
project(CharliesDemo VERSION 1.0)
下面,我们可以在源代码文件中使用了。使用的bridge在哪里呢?那就是使用CMake里的configure_file指令。
他的作用很简单:将input文件复制到output文件,并在输入文件内容中的变量,替换引用为@VAR@或${VAR}的变量值。每个变量引用将替换为该变量的当前值,如果未定义该变量,则为空字符串。
实际上就是做拷贝替换的工作
-
COPYONLY:只拷贝文件,不进行任何的变量替换。这个选项在指定了NEWLINE_STYLE选项时不能使用(无效)。
-
ESCAPE_QUOTES:躲过任何的反斜杠(C风格)转义。
-
@ONLY:限制变量替换,让其只替换被@VAR@引用的变量(那么${VAR}格式的变量将不会被替换)。这在配置${VAR}语法的脚本时是非常有用的。
-
NEWLINE_STYLE style:指定输出文件中的新行格式。UNIX和LF的新行是\n,DOS和WIN32和CRLF的新行格式是\r\n。这个选项在指定了COPYONLY选项时不能使用(无效)。
通常情况下,输入文件以.h.in为后缀,输出文件以.h为后缀。
我们下面来试试看:
#define VERSION_MAJOR @CharliesDemo_VERSION_MAJOR@ #define VERSION_MINOR @CharliesDemo_VERSION_MINOR@
引用工程的属性名称正式:工程名称+工程属性。我们的CMake在构建的时候就会替换我们的@VAR@为我们CMake的值。下面在CMake中配置:
configure_file(Config.h.in Config.h)
我们可以看看生成的Config.h文件
#define VERSION_MAJOR 1 #define VERSION_MINOR 0
使用一下,你会发现一个问题:
#include <stdio.h> #include "Config.h" #include "lib.h" int main() {printf("VERISON_MAJOR: %d", VERSION_MAJOR);printf("%d + %d = %d", 1, 2, my_add(1, 2)); }
gcc找不到我们的Config.h。这里需要超前的提供一个这样的命令:
target_include_directories(CharliesDemo PUBLIC "${PROJECT_BINARY_DIR}")
这句话的含义是:对于目标CharliesDemo提供要索引的目录为我们的build路径。这里正有Config.h!
下面我们来看看我们的CMakeLists.txt脚本:
cmake_minimum_required(VERSION 3.30) project(CharliesDemoVERSION 1.0) configure_file(Config.h.in Config.h) add_executable(CharliesDemo lib.c main.c) target_include_directories(CharliesDemo PUBLIC "${PROJECT_BINARY_DIR}")
看官自行回忆每一句话的含义。
Reference
_VERSION_MAJOR
_VERSION_MINOR
configure_file()
target_include_directories()
CMAKE_CXX_STANDARD
CMAKE_CXX_STANDARD_REQUIRED
set()
相关文章:

CMake 教程跟做与翻译 2
目录 STEP 1(Extra A):指定C的版本 STEP1(Extra B): 为我们的项目添加版本信息与配置的头文件 Reference STEP 1(Extra A):指定C的版本 有的时候,我们会是对一个比较年老的项目进行构建。这个时候,我们可能就需要限制一下使用的…...

Linux 之 安装软件、GCC编译器、Linux 操作系统基础
安装软件、GCC编译器、Linux 操作系统基础 学习任务: 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…...

[CTF夺旗赛] CTFshow Web13-14 详细过程保姆级教程~
前言 CTFShow通常是指网络安全领域中的“Capture The Flag”(夺旗赛)展示工具或平台。这是一种用于分享、学习和展示信息安全竞赛中获取的信息、漏洞利用技巧以及解题思路的在线社区或软件。参与者会在比赛中收集“flag”,通常是隐藏在网络环境中的数据或密码形…...

【Matlab】Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表
Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表 初始数据 filename C:\Users\jia\Desktop\yadian\data\1Hz 2024_09_12 17_10_06.csv; 代码: clc;clear close all; % 读取Excel文件 filename C:\Users\jia\Desktop\yadian\data\1Hz …...

Awaken Likho恶意组织利用高级网络工具对俄罗斯政府发起“猛攻”
近日,俄罗斯政府机构和工业实体遭遇了一场名为“ Awaken Likho ”的网络活动攻击活动。 卡巴斯基表示,攻击者现在更倾向于使用合法MeshCentral平台的代理,而不是他们之前用来获得系统远程访问权限的UltraVNC模块。这家俄罗斯网络安全公司详细…...

【洛谷】P10938 Vani和Cl2捉迷藏 的题解
【洛谷】P10938 Vani和Cl2捉迷藏 的题解 洛谷传送门 题解 噢噢噢噢哦哦哦,神奇网络流,有点像 Floyd 在图上选取若干条互不相交的路径,并让这些路径不重不漏覆盖到每一个点。符合上述要求且总数最小的方案就叫做原图的最小路径点覆盖&…...

三角形面积 python
题目: 计算三角形面积 代码: a int(input("请输入三角形的第一个边长:")) b int(input("请输入三角形的第二个边长:")) c int(input("请输入三角形的第三个边长:")) s (abc) / 2 #…...

【C++第十七章】二叉搜索树
【C第十七章】二叉搜索树 二叉搜索树的介绍🧐 二叉搜索树又称二叉排序树,它可能是空树,也可能是具有以下性质的二叉树: 若它的左子树不为空,则左子树上的所有节点的值小于根节点的值若它的右子树不为空,则…...

Springboot 文件上传
文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。 文件上传前端需要完成的准备: 需要提交一个form表单,表单必须包含以下三点(上传文件页面三要素) …...

简单认识redis-5 jdbc 与 jedis 使用的区别
概念与功能定位 JDBC (Java Database Connectivity) JDBC 是 Java 语言用于连接数据库(如 MySQL、Oracle 等关系型数据库)的标准 API。它提供了一套统一的接口,让 Java 程序能够与各种数据库进行交互,执行 SQL 语句(如…...

Unity3d动画插件DoTween使用指南
1、DoTween是什么? DoTween是一款对象动画类插件,它是一款针对Unity 3D编辑器的、快速高效的、安全的、面向对象的补间动画引擎,并且对C#语言开发做出了很多的优化。另外,它使得开发者无需通过Unity内置的Animator或Coroutines即可…...

学习函数知识
学习函数是编程中的重要基础,以下是关于函数的详细知识点: 1. 函数的定义 函数是一组执行特定任务的代码块,可以重复使用。在 JavaScript 中,可以通过以下方式定义函数: 函数声明: function functionNam…...

案例-表白墙简单实现
文章目录 效果展示初始画面提交内容后画面(按键按下) 代码区 效果展示 初始画面 提交内容后画面(按键按下) 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…...

和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈
在科技迅猛发展的时代,人工智能(AI)无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术,试图借助其变革力量在竞争中突围,然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…...

基于函数计算FC 部署 ComfyUI实现AI生图 的优势
基于函数计算FC 部署 ComfyUI实现AI生图 的优势 部署ComfyUI实现AI生图使用函数计算FC 一键部署ComfyUI 绘画平台的优势有哪些? 在文章开始之前,先来看一下基于函数计算FC 部署 ComfyUI实现AI生图 的大概步骤,整个基础部署操作比较简单。即便…...

瑞萨IDE:CS+ for CC编译过程中执行脚本文件
最近发现使用CS for CC IDE发现一个很有意思的功能。编译工程过程中,IDE自动执行Python脚本和批处理脚本,极大地提高开发效率。 编写好脚本文件后,在IDE中选择CC-RH(Build Tool)->Common Options->Others。 Co…...

在 CentOS 上安装 Docker 的步骤
在 CentOS 上安装 Docker 的步骤如下: 步骤 1:更新系统包 sudo yum update -y步骤 2:安装依赖包 确保安装了 yum-utils、device-mapper-persistent-data 和 lvm2,这些是 Docker 运行所需的依赖项: sudo yum instal…...

【C#生态园】探索地理信息系统软件套件与库:功能、API和应用
探索地理信息系统:软件套件与库详解 前言 地理信息系统(GIS)是当今世界上广泛使用的技术之一,它以空间数据为基础,能够提供丰富的地理信息分析和可视化功能。在GIS领域,有许多优秀的软件套件和库…...

Jupyter的使用分享
文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候,发现大家对于pycharm更容易上手(可能是比较好设置中文的原因),在…...

24龙信比赛复现
案情简介: 近期,某公安机关接到受害人报案:通过微信添加认识一位相亲中介客服,客服邀约其与“相亲”对象进行选妃,受害人上钩后,整个过程被涉案团伙录音录像,同时,该客服以有更多的…...

PHP反射机制
HP反射机制是PHP语言中的一个强大特性,它允许程序在运行时检查、获取和操作类、方法、属性等元素的信息。这一机制极大地提高了PHP代码的灵活性和可维护性,使得开发者能够在不修改原有代码结构的情况下,动态地了解并操作代码。以下是对PHP反射…...

使用阿里云试用资源快速部署web应用-dofaker为例
本文介绍使用阿里云的试用资源部署dofaker的方法,本教程主要作学习在阿里云部署web应用之用,部署好应用之后,可以在任何地点通过公网ip访问web应用。 一、创建云主机 登录阿里云账户之后,点击控制台: 点击云服务器EC…...

需求11——解决字段无法清空的两个小bug
目录 背景 第一个小bug——问题阐述 第一个小bug——解决方案 第二个小bug——问题阐述 第二个小bug——解决方案 总结 背景 已经写了一个上午的文章了,写完这篇就可以去吃饭了。这也是这几个月的我写的最后一个小bug文章,把这篇文章写完就搞定了…...

mysql学习教程,从入门到精通,SQL 创建索引(CREATE INDEX 语句)(35)
1、SQL 创建索引(CREATE INDEX 语句) 在SQL中,创建索引(CREATE INDEX)是一种用于提高数据库查询性能的方法。索引类似于书的目录,通过它可以更快地定位到表中的特定行。以下是一个创建索引的示例,以及对其各部分的解释…...

Pikachu-Cross-Site Scripting-DOM型xss_x
查看代码,输入的内容,通过get请求方式,用text 参数带过去; 获取text内容,赋值给xss 然后拼接到 dom 里;构造payload的关键语句: <a href"xss">就让往事都随风,都随风吧</a&…...

Pikachu-Cross-Site Scripting-xss之htmlspecialchars
首先输入各种字符 查看页面元素,可以看到这里对一些符号做了转换,但是 单引号等几个符号没处理; 从代码上看;使用单引号做闭合; 构造payload a onclickalert(11) 提交,得到xss攻击...

CSS基础中padding详解
文章目录 CSS基础中padding详解一、引言二、Padding基础1、Padding属性1.1、Padding的四个方向 2、Padding的值类型3、代码示例 三、Padding简写方法1、简写顺序2、简写规则3、代码示例 四、Padding对元素大小的影响1、解决方案1.1、Box-sizing属性1.2、计算实际宽度 五、总结 …...

OpenGL笔记十九之相机系统
OpenGL笔记十九之相机系统 —— 2024-10-02 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十九之相机系统1.运行1.1.游戏相机1.2.轨迹球相机 2.游戏相机与轨迹球相机切换3.博主笔记本要运行需要更改的文件更改1:28_OpenGL_CameraSystem/applicat…...

P-Tuning v2:一种普遍有效的提示调整方法
人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型通过微调(fine-tuning)来适应特定任务虽然效果显著,但存在训练成本高、参数存储量大等问题。为了解决这些问题,清华大学的研究者们提出了一种名为P-Tuning v2的提示调整&am…...

微信小程序启动不起来,报错凡是以~/包名/*.js路径的文件,都找不到,试过网上一切方法,最终居然这么解决的,【避坑】命运的齿轮开始转动
app.json "resolveAlias": {"~/*": "/*"},文件代码也没有问题,网上的方法试过来了,大模型AI也问过遍,熬夜到凌晨2点半,最不可思议的是居然是因为微信开发者工具版本的问题,我真的是笑死…...