cmake 基本使用

目录

CMake都有什么?

使用cmake一般流程为:

1 生成构建系统

使用命令在build外编译代码:

cmake基本语法

指定使用最低版本的cmake

指定项目名称

指定生成目标文件的名称

指定C++版本

cmake配置文件使用

cmake配置文件生成头文件

版本号定义方法一:

版本号定义方法二:

如果想在cmake文件中定义变量,代码中使用值

参考:


CMake都有什么?

CMake提供cmake、ctest和cpack三个命令行工具分别负责构建、测试和打包。本文主要介绍cmake命令。

使用cmake一般流程为:

  1. 生成构建系统(buildsystem,比如make工具对应的Makefile);

  2. 执行构建(比如make),生成目标文件;

  3. 执行测试、安装或打包。

1 生成构建系统

通过cmake命令生成构建系统。

通过cmake --help可以看到cmake命令支持的详细参数,常用的参数如下:

参数含义
-S指定源文件根目录,必须包含一个CMakeLists.txt文件
-B指定构建目录,构建生成的中间文件和目标文件的生成路径
-D指定变量,格式为-D <var>=<value>,-D后的空格可省略

 demo1:

1.是配置时间,2是构建时间. 

 至于为什么在cmake后加 -G "Unix Makefiles"是因为我使用的是win10系统,如果不加这个,cmake会编程成VS2015的sln文件.

cmake -S . -B build

 上面的是编译生成makefile文件,你还需要cd进build文件make一下才可以生成可执行文件,其实也可以不进入build文件就可以编译.就是在使用下面的命令.

使用命令在build外编译代码:

cmake --build build

 这个命令就是编译命令,需要注意的是,第一个 --build是必须写的,第二个build是生成makefile的文件夹,如果你存放的makefile文件夹不是build而是 qwer你的命令应该是这么写

cmake --build qwer

cmake基本语法

指定使用最低版本的cmake

cmake_minimum_required(VERSION 3.20)

指定项目名称

project(Tutorial)

指定生成目标文件的名称

add_executable(Tutorial tutorial.cxx)

指定C++版本

设置C++11 版本

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

cmake配置文件使用

configure_file(TutorialConfig.h.in TutorialConfig.h)
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")

这行代码是添加头文件的代码,第一个参数是把头文件链接到Tutorial这个生成文件中,第二个是共有的也有私有的,重点是第三个变量"${PROJECT_BINARY_DIR}"(不加双引号也可以${PROJECT_BINARY_DIR})这个是一个目录,是project项目-B生成makefile文件的目录.因为configure_file要把cmake的.in配置文件生成头文件,生成的目录就是在 

-B 的目录所以要添加这个,要不然会找不到头文件的.

cmake配置文件生成头文件

这行命令就是cmake的配置文件生成c++头文件当然前面的文件名可以随便起.

configure_file(TutorialConfig.h.in TutorialConfig.h)

版本号定义方法一:

 TutorialConfig.h.in 配置文件中的内容

 需要注意的是1的位置是宏定义可以随便写,后面的两个@符号中间的必须是PROJECT_VERSION_MAJOR而2号的之所以写成Tutorial是因为在cmake中定义了project是Tutorial所以也可以写成那样子的.但是还是建议写成PROJECT_VERSION_MINOR这样的.

注意:@PROJECT_VERSION_MAJOR@一定要这么写多加一个空格都不行如果@PROJECT_VERSION_MAJOR @如果在@字符之间加了一个空格编译就会失败. 

 头文件生成的样子,第一行就是错误的,第二行才是对的

 为什么会有出这个错误?

是因为我在写demo的时候,由于vscode安装了代码格式的差价在按下ctrl + s保存代码的时候vscode总会自动的就帮我加了一个空格,所以才会出这个错误的.

 

在代码中使用宏定义才行,也就是上面1号的宏在代码中可以读取.其中的主版本号为1,副版本号为0是因为cmake中设置的版本号1号是主版本,2号是副版本号 

 

版本号定义方法二:

配置文件必须使用 PROJECT_VERSION_MAJOR

cmake文件定义版本号.我喜欢这个定义版本号的方法. 

 

如果想在cmake文件中定义变量,代码中使用值

首先在cmake文件中定义一个变量:

set(CXX_HELL "qwerty") 想在代码中打印qwerty这个值.

在配置文件中这么设置

#define CXX_HELL "@CXX_HELL@"

 需要注意的是"@CXX_HELL@"一定要加上引号要不然就不是字符串了.

如果你想打印数字可以不加双引号:

例如:

1号不加双引号也是字符串,2号是定义的int型cmake文件中其实也是字符串,只是在cmake配置不加双引号就成了int型的了. 

 还有个细节就是在cmake文件中定义的变量一定要在configure_file(TutorialConfig.h.in TutorialConfig.h)前,要不就识别不到了

 

参考:

CMake应用:基础篇_cmake -s_老狼主的博客-CSDN博客

CMake基础教程01-基本起点_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《操作系统》by李治军 | 实验6 - 信号量的实现和应用

目录 一、实验目的 二、实验内容 &#xff08;一&#xff09;用信号量解决生产者—消费者问题 &#xff08;二&#xff09;实现信号量&#xff0c;用生产者—消费者程序检验 三、实验准备 1、信号量 2、多进程共享文件 3、终端也是临界资源 4、原子操作、睡眠和唤醒 …

C++中string类的常用函数

文章目录 默认成员函数常见构造函数(constructor) string类的容量操作size()empty()capacity()reserve()clear()resize() string类对象的访问及遍历操作重载 [ ]begin()end()begin() end() 遍历字符串rbegin()rend()rbegin() rend()反向遍历字符串C11范围for string类对象修改…

广域网技术——ppp,pppoe

目录 PPP协议概述 PPP协议原理 PPP协议三大组件&#xff1a; PPP链路建立流程 PPP连接建立接口状态&#xff1a; LCP协议报文格式 PPP协议报文格式&#xff1a; 1&#xff0c;链路层建立连接过程 LCP协商过程-正常协商 LCP协商-参数不一致 LCP协商-参数不识别 2&#xf…

YOLOv5/v7 添加注意力机制,30多种模块分析③,GCN模块,DAN模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、GCN 模块1、GCN 模块的原理2、实验结果3、应用示例 三、DAN模块1、DAN模块的原理2、实验结果3、应用示例 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xf…

AMC12和高考数学哪个更难?知识点有哪些不同?

AMC12和高考数学哪个更难&#xff1f;知识点有哪些不同&#xff1f;今天小编给大家来详细介绍一下&#xff01; 难度对比 从难度上看&#xff0c;高考数学的计算量更大&#xff0c;并且知识点比AMC10/12超前&#xff0c;需要用到极限和微积分的知识。 反观AMC10/12不需要用到…

数据结构与算法之美 | 栈

栈结构&#xff1a;后进者先出&#xff0c;先进者后出 栈是一种“操作受限”的线性表 当某个数据集合只涉及在一端插入和删除数据&#xff0c;并且满足后进先出、先进后出的特性&#xff0c;这时我们就应该首选“栈”这种数据结构 栈的实现 使用数组实现&#xff1a;顺序栈…

初探图神经网络——GNN

title: 图神经网络(GNN) date: tags: 随笔知识点 categories:[学习笔记] 初探图神经网络(GNN) 文章来源&#xff1a;https://distill.pub/2021/gnn-intro/ 前言&#xff1a;说一下为什么要写这篇文章&#xff0c;因为自己最近一直听说“图神经网络”&#xff0c;但是一直不了…

pycharm使用之torch_sparse安装

正式安装之前要先查看一下torch的版本 一、查看torch版本 1、winR &#xff0c;输入cmd 2、输入python 3、 输入import torch&#xff0c;然后输入torch.__version__&#xff0c;最后回车 可以看到我的torch版本是1.10.0 二、下载合适的torch_sparse版本 1、打开链接 https…

接口反应慢优化

遇到某个功能&#xff0c;页面转圈好久&#xff0c;需要优化 1.F12 查看接口时间 2.看参数 总共耗时9.6s Waiting for sercer response 时间是2秒 Content Download 7秒 慢在Content Download F12查看接口响应 显示Failed to load response data:Request content was e…

spark入门 高可用部署HA(五)

一、standalone基于修改部署 https://blog.csdn.net/weixin_43205308/article/details/131070277?spm1001.2014.3001.5501 二、安装ZOOKEEPER zookeeper 安装下载与集群 三、修改conf下的spark-env.sh vim conf/spark-env.sh注释以下内容&#xff08;根据自己环境修改&am…

visual studio 2022,ADO.NET 实体数据模型添加 sqlite数据库对象

文章目录 前言前期环境博客github 文档解析文件安装说明文件下载省流版nuget环境配置成功标志sqlite连接测试 前言 我们知道ADO.NET 实体数据模型特别适合动态开发数据库。因为ADO.NET可以使用DB First 开发 我们在开发一个程序的时候&#xff0c;经常会动态更新数据库字段&a…

算法模板(3):搜索(4):高等图论

高等图论 有向图的强连通分量 相关概念 强连通分量&#xff1a;Strongly Connected Component (SCC).对于一个有向图顶点的子集 S S S&#xff0c;如果在 S S S 内任取两个顶点 u u u 和 v v v&#xff0c;都能找到一条 u u u 到 v v v 的路径&#xff0c;那么称 S S…

C++多态和文件读写

C黑马&#xff0c;每天1.5倍速2个视频&#xff08;1小时&#xff09;&#xff0c;看到9月1日完成314个视频 目录 &#x1f511;多态 &#x1f333;基本语法 &#x1f333;原理剖析 &#x1f333;案例1 -- 计算器类 &#x1f333;纯虚函数和抽象类 &#x1f333;案例2 --…

redis知识复习

redis知识复习 redis基础知识一. redis的认识1. 非关系型数据库 与 传统数据库 的区别2. 安装redis并设置自启动3. 熟悉命令行客户端4. 熟悉图形化工具RDM 二. redis的命令与数据结构1. 数据结构介绍2. redis通用命令&#xff08;熟练掌握&#xff09; 三. redis的Java客户端1.…

SpringBoot整合Flyway实现数据库的初始化和版本管理

文章目录 一、Flyway1、介绍2、业务痛点3、个人理解 二、SpringBoot整合flyway1、整合2、SQL文件命名3、版本号校验算法4、工作流程5、注意事项 一、Flyway 1、介绍 Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用&#xff0c;或者在Java应用程序中引入…

【MySQL】数据表的基本操作

目录 1. 创建表 2. 创建表案例 2.1 创建一个users表 2.2 查看表结构 2.3 修改表 3. 删除表 MySQL&#x1f337; 1. 创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储…

chatgpt赋能python:如何升级Python的pip版本

如何升级Python的pip版本 如果你使用Python来进行程序开发&#xff0c;那么你一定需要用到pip&#xff0c;它是Python的包管理器&#xff0c;用于安装和管理各种Python库。 不过&#xff0c;一旦你开始使用pip&#xff0c;你可能会遇到一个问题&#xff1a;你的pip版本可能会…

几种技巧让大模型(ChatGPT、文心一言)帮你提高写代码效率!

代码神器 自从大模型推出来之后&#xff0c;似乎没有什么工作是大模型不能做的。特别是在文本生成、文案写作、代码提示、代码生成、代码改错等方面都表现出不错的能力。下面我将介绍运用大模型写代码的几种方式&#xff0c;帮助程序员写出更好的代码&#xff01;&#xff08;…

利用AI点亮副业变现:5个变现实操案例的启示

AI变现副业实操案例 宝宝起名服务AI科技热点号头像壁纸职业头像收徒&#xff1a;萌娃头像定制头像平台挂载 小说推广号流量营销号百家号AI共创计划公众号流量主 知识付费知识星球小报童&#xff1a; 整体思维导图&#xff1a; 在这里先分享五个实操案例: 宝宝起名服务AI科技热…

cvte 前端一面 凉经

cvte 前端一面 凉经 原文面试题地址&#xff1a;https://www.nowcoder.com/discuss/353159272857018368?sourceSSRsearch 1. vuex原理 和vuerouter的原理差不多 2. vuerouter的原理 ​ 首先在main.js中&#xff0c;import router from ‘./router’ 引入在router文件夹下面…