cmake 基本使用

news2024/11/19 1:29:24

目录

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

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

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

相关文章

软件测试正在面试银行的可以看下这些面试题

前言 最近呢有很多的小伙伴问我有没有什么软件测试的面试题&#xff0c;由于笔者之前一直在忙工作上的事情&#xff0c;没有时间整理面试题&#xff0c;刚好最近休息了一下&#xff0c;顺便整理了一些面试题&#xff0c;现在就把整理的面试题分享给大家&#xff0c;废话就不多说…

C 语言实现简单工厂模式

文章目录 1. 背景介绍2. 设计实现3. 运行测试4. 总结 1. 背景介绍 印象中&#xff0c;设计模式是由面向对象的语言(C、JAVA)才能完成的&#xff0c;而 C 语言是面向过程的语言&#xff0c;不能实现设计模式。但C 语言中有 函数指针、回调函数 等机制&#xff0c;使用这些机制便…

Java中线程的生命周期

Java中线程的生命周期 Java中线程的声明周期与os中线程的生命周期不太一样&#xff0c;java中线程有6个状态&#xff0c;见下&#xff1a; NEW: 初始状态&#xff0c;线程被创建出来但没有被调用 start() 。RUNNABLE: 运行状态&#xff0c;线程被调用了 start()等待运行的状态…

Elasticsearch:使用 Redis 让 Elasticsearch 更快

Elasticsearch 是一个强大的搜索引擎&#xff0c;可让你快速轻松地搜索大量数据。但是&#xff0c;随着数据量的增长&#xff0c;响应时间可能会变慢&#xff0c;尤其是对于复杂的查询。在本文中&#xff0c;我们将探讨如何使用 Redis 来加快 Elasticsearch 搜索响应时间。 Re…

【数据结构】常见排序算法——常见排序介绍、归并排序、各大排序复杂度和稳定性

文章目录 1.常见排序2.归并排序2.1归并排序基本思想2.2归并排序的实现2.3归并排序特性总结 3.各大排序复杂度和稳定性 1.常见排序 2.归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andCon…

商业图表工具推荐,热门商业图表工具有哪些?

在如今的商业环境下&#xff0c;数据分析和可视化是非常重要的一环。不仅可以帮助企业更好地了解自身情况&#xff0c;还能为决策提供有力支持。因此&#xff0c;选择一个好用的商业图表工具对于报表开发人员来说是非常重要的。下面将为大家介绍7款热门商业图表工具&#xff0c…

Mac电脑删除第三方软件工具CleanMyMac X

经常使用Mac的人都知道&#xff0c;Mac除了可以在AppStore下载应用程序&#xff0c;还有许多软件是需要在网页上搜索下载的第三方软件。那么这类第三方软件软件除了下载方式不同之外还有什么是和从App store下载的软件有区别的吗&#xff1f;答案是肯定的&#xff0c;那就是这些…

Docker容器进入的4种方式

Docker容器进入的4种方式 Docker容器进入的4种方式 在使用Docker创建了容器之后&#xff0c;大家比较关心的就是如何进入该容器了&#xff0c;其实进入Docker容器有好几多种方式&#xff0c;这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种…

带你了解自动化测试只需要一分钟

目前自动化测试并不属于新鲜的事物&#xff0c;或者说自动化测试的各种方法论已经层出不穷&#xff0c;但是&#xff0c;能够明白自动化测试并很好落地实施的团队还不是非常多&#xff0c;我们接来下用通俗的方式来介绍自动化测试…… 首先我们从招聘岗位需求说起。看近期的职业…

软件测试什么样的技术才能拿20K薪资?

年少不懂面试经&#xff0c;读懂已是测试人。 大家好&#xff0c;我叫木江&#xff0c;一名历经沧桑&#xff0c;看透互联网行业百态的测试从业者&#xff0c;经过数年的勤学苦练&#xff0c;精钻深研究&#xff0c;终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0c;早…

MySQL数据库基础 09

第九章 子查询 1. 需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2. 单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING 中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.5 非法使用子查询 3. 多行子查询3.1 多行比较操作符3.2 代码示例3.3 空…

深入浅出对话系统——自然语言理解模块

自然语言理解 首先回顾一下自然语言理解的概念。 自然语言理解(Natural Language Understanding)包含三个子模块&#xff1a; 其中领域识别和意图识别都是分类问题&#xff0c;而语义槽填充属于序列标注问题。所以&#xff0c;在自然语言理解中&#xff0c;我们要解决两个分类…

阿里云(Linux)安装Docker教程

首先安装docker&#xff0c;需要找到帮助文档&#xff0c;那肯定是我们的官网&#xff1a; Install Docker Engine on CentOS | Docker Documentation 找到对应的位置&#xff0c;这里是安装在CentOS中&#xff0c;版本需要Ce…

2021~2022 学年第二学期《信息安全》考试试题(A 卷)

北京信息科技大学 2021~2022 学年第二学期《信息安全》考试试题&#xff08;A 卷&#xff09; 课程所在学院&#xff1a;计算机学院 适用专业班级&#xff1a;计科1901-06&#xff0c;重修 考试形式&#xff1a;(闭卷) 一、选择题&#xff08;本题满分10分,共含10道小题,每小题…

Jenkins结合gitee自动化部署SpringBoot项目

安装 安装教程 插件选择 Gitee Plugin 配置 源码管理 填写源码地址 注意&#xff1a;请确保genkins所在的服务器有权限git拉取远程仓库代码&#xff0c;如果不可以请参考ssh配置centos 配置ssh拉取远程git代码 源码管理 构建触发器 1.勾选Gitee webhook 触发构建 2.生成we…

Python3实现基于ARIMA模型来预测茅台股票价格趋势

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

实验篇(7.2) 10. 扩充物理实验环境 ❀ 远程访问

【简介】本着先简后难原则&#xff0c;我们前面所做的实验&#xff0c;均为客户端远程访问防火墙&#xff0c;现在我们需要实现防火墙和防火墙之间的访问。在现有的实验环境中&#xff0c;加再入一台防火墙。让我们看看需要怎样操作。 网络拓扑 企业之间最常见的远程互相访问&a…

SSM框架编程技术期末复习内容

考试题型&#xff1a;简答题编程题 SSM框架编程技术期末复习 一、代码干货Mybatis实现查询用户表记录数Mybatis根据用户名对用户表进行模糊查询Mybatis使用resultMap实现用户信息查询(用户表和角色表查询)Mybatis根据用户角色id获取用户列表Mybatis获取指定用户的相关信息及其…

【Mircosft Edge】插件推荐

插件推荐 1.推荐插件1.1 油猴 tempermonkey1.2 免费音乐播放器 Listen 1 2.添加插件2.1 打开“Micrsoft Edge 外接程序”2.2 获取新的扩展2.3 搜索插件2.3.1 在Micrsoft Edge 外接程序搜索框中输入tampermonkey&#xff0c;然后点击获取按钮进行安装2.3.2 在Micrsoft Edge 外接…

Misc(2)

第N种方法解决 拿到题目后是一个exe文件&#xff0c;运行不了 为啥非要整个exe&#xff0c;看着都害怕 改后缀后打开发现是base64编码的图片 利用工具解码转png格式 Base64解码 Base64编码 UTF8 GB2312 UTF16 GBK 二进制 十六进制 解密 - The X 在线工具 (the-x.cn) 下载下来的…