当前位置: 首页 > news >正文

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)&#xff1a;指定C的版本 STEP1(Extra B): 为我们的项目添加版本信息与配置的头文件 Reference STEP 1(Extra A)&#xff1a;指定C的版本 有的时候&#xff0c;我们会是对一个比较年老的项目进行构建。这个时候&#xff0c;我们可能就需要限制一下使用的…...

Linux 之 安装软件、GCC编译器、Linux 操作系统基础

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

[CTF夺旗赛] CTFshow Web13-14 详细过程保姆级教程~

前言 ​ CTFShow通常是指网络安全领域中的“Capture The Flag”(夺旗赛)展示工具或平台。这是一种用于分享、学习和展示信息安全竞赛中获取的信息、漏洞利用技巧以及解题思路的在线社区或软件。参与者会在比赛中收集“flag”&#xff0c;通常是隐藏在网络环境中的数据或密码形…...

【Matlab】Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表

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

Awaken Likho恶意组织利用高级网络工具对俄罗斯政府发起“猛攻”

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

【洛谷】P10938 Vani和Cl2捉迷藏 的题解

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

三角形面积 python

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

【C++第十七章】二叉搜索树

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

Springboot 文件上传

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

简单认识redis-5 jdbc 与 jedis 使用的区别

概念与功能定位 JDBC (Java Database Connectivity) JDBC 是 Java 语言用于连接数据库&#xff08;如 MySQL、Oracle 等关系型数据库&#xff09;的标准 API。它提供了一套统一的接口&#xff0c;让 Java 程序能够与各种数据库进行交互&#xff0c;执行 SQL 语句&#xff08;如…...

Unity3d动画插件DoTween使用指南

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

学习函数知识

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

案例-表白墙简单实现

文章目录 效果展示初始画面提交内容后画面&#xff08;按键按下&#xff09; 代码区 效果展示 初始画面 提交内容后画面&#xff08;按键按下&#xff09; 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…...

和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈

在科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术&#xff0c;试图借助其变革力量在竞争中突围&#xff0c;然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…...

基于函数计算FC 部署 ComfyUI实现AI生图 的优势

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

瑞萨IDE:CS+ for CC编译过程中执行脚本文件

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

在 CentOS 上安装 Docker 的步骤

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

【C#生态园】探索地理信息系统软件套件与库:功能、API和应用

探索地理信息系统&#xff1a;软件套件与库详解 前言 地理信息系统&#xff08;GIS&#xff09;是当今世界上广泛使用的技术之一&#xff0c;它以空间数据为基础&#xff0c;能够提供丰富的地理信息分析和可视化功能。在GIS领域&#xff0c;有许多优秀的软件套件和库&#xf…...

Jupyter的使用分享

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

24龙信比赛复现

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

CANN/asc-devkit Round接口文档

Round 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann…...

YOLO26优化:TIP2026 FourierSR | FourierSR引入YOLO C3k2:解决感受野局限,实现高效全局特征交互

💡💡💡现有 YOLO C3k2 模块主要基于卷积与跨阶段部分连接,虽能平衡计算与精度,但仍存在以下问题: 感受野受限:堆叠的小核卷积(如 33)感受野有限,难以捕获全局上下文,对尺度变化大或远距离依赖的目标(如小目标、遮挡目标)特征提取能力不足。 特征混合效率低:通…...

告别数据壁垒:用ArcGIS Editor for OSM插件,5分钟搞定OSM数据下载与本地编辑

告别数据壁垒&#xff1a;用ArcGIS Editor for OSM插件&#xff0c;5分钟搞定OSM数据下载与本地编辑 在空间数据分析领域&#xff0c;OpenStreetMap&#xff08;OSM&#xff09;作为开放的全球地理数据库&#xff0c;已成为许多GIS从业者的重要数据来源。然而&#xff0c;传统O…...

潍坊漆面车衣怎么选才合适?

很多潍坊车主在给爱车选漆面保护膜时&#xff0c;都会有这样的困惑&#xff1a;网上信息真假难辨&#xff0c;线下门店推荐又参差不齐&#xff0c;到底该怎么选才合适&#xff1f;其实&#xff0c;选漆面车衣没有想象中那么复杂&#xff0c;关键是要掌握一套通用的判断标准。本…...

别再只会写脚本了!用MATLAB面向对象编程重构你的数据处理流程(附完整Point2D类示例)

从脚本到对象&#xff1a;MATLAB面向对象编程的工程化实践 在科研与工程计算领域&#xff0c;MATLAB长期占据着不可替代的地位。然而&#xff0c;许多用户在使用多年后&#xff0c;依然停留在编写线性脚本的阶段&#xff0c;导致代码库逐渐演变成难以维护的"意大利面条式代…...

Gemini 垂直行业模型路由:按意图选择不同Prompt与参数集

在AI开发社区里&#xff0c;不少工程师都在尝试把多个大模型接入实际项目。工具整合站点作为AI模型聚合平台&#xff0c;让开发者能快速对比Gemini与其他模型在不同行业场景下的表现。今天我们来聊聊如何为Gemini搭建一套垂直行业模型路由机制&#xff0c;根据用户意图自动选择…...

DDR3 颗粒信号定义解析

本文围绕 DDR3 标准信号定义、核心信号工作原理、PCB Layout 等长设计规则及行业常见误区展开&#xff0c;全程聚焦工程实践与底层原理。一、DDR3 标准信号完整清单&#xff08;x16 位宽基准&#xff0c;x32 位宽对应翻倍&#xff09;1. 数据信号&#xff08;Data&#xff09;表…...

Mos:三步解决Mac鼠标滚动卡顿,免费享受触控板般丝滑体验

Mos&#xff1a;三步解决Mac鼠标滚动卡顿&#xff0c;免费享受触控板般丝滑体验 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction in…...

别再只把JTAG当烧录器了!一文搞懂它的边界扫描(Boundary-Scan)到底怎么玩

解锁JTAG边界扫描的隐藏技能&#xff1a;从烧录到硬件诊断的全能玩法 在嵌入式开发领域&#xff0c;JTAG接口常被简化为"烧录工具"的代名词——这种认知偏差让我们错失了它最强大的能力。想象一下&#xff1a;当PCB上某个关键信号无法测量时&#xff0c;当BGA封装的芯…...

ARM架构LDRSB/LDRSH有符号加载指令详解

1. ARM架构中的有符号加载指令概述在嵌入式系统和低功耗应用领域&#xff0c;ARM处理器凭借其精简高效的指令集架构占据主导地位。内存加载指令作为处理器与外部存储交互的核心操作&#xff0c;其设计直接影响系统性能和数据处理的准确性。LDRSB&#xff08;Load Register Sign…...