cmake 基本使用

news/2024/12/23 4:22:31/

目录

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.ppmy.cn/news/328266.html

相关文章

华为荣耀7i刷linux,华为荣耀7i刷机教程_华为荣耀7i强刷官方系统包

华为荣耀7i的刷机教程来说一下&#xff0c;有没有需要的呢&#xff0c;之前给大家说过了有关这个手机的固件包的下载了&#xff0c;可是有一些机友不知道固件包下载下来之后如何操作&#xff0c;所以在这里整理了一下详细的刷机教程来供大家参考了&#xff0c;大家都知道&#…

华为荣耀8电信卡显示无服务器,华为荣耀8青春版

华为荣耀8青春版支持电信吗&#xff1f;华为荣耀8青春版支持电信卡吗&#xff1f;这是很多朋友关注的话题&#xff0c;自从荣耀8青春版上市以来&#xff0c;大家对它寄予了很高的期待&#xff0c;当然它惊艳的外观&#xff0c;给人带来了很大的冲击&#xff0c;具体是不是支持电…

华为ws851 虚拟服务器,荣耀路由Pro设置教程 华为WS851路由器怎么设置-192路由网...

问:华为的荣耀路由Pro怎么设置?华为WS851路由器如何设置才能上网?新买了一台荣耀路由Pro,但是我设置后还是不能上网。请问,这个荣耀路由Pro要如何设置才能上网? 答:华为荣耀路由器Pro的型号是WS851,一台新购买回来的荣耀路由Pro,或者是刚恢复出厂设置后的荣耀路由Pro;…

【深度学习炼丹大杀器——mlrunner初体验(以mmdetection为例)】

深度学习炼丹大杀器——mlrunner初体验&#xff08;以mmdetection为例&#xff09; 自动化炼丹&#xff0c;告别手动运行的烦恼~ 0.引言 了解深度学习的人都知道&#xff0c;炼丹是一种很玄学的事&#xff0c;并且还存在以下问题&#xff1a; 效率&#xff1a;在训练模型时&…

g++ 编译选项

1&#xff0c;基本编译过程 g可以用于编译C代码生成可执行程序&#xff0c;从原始代码到生成可执行过程中实际经历了以下4个步骤&#xff1a; 1. 预处理&#xff1a;宏替换&#xff0c;注释消除&#xff0c;查找相关库文件等[使用-E参数]。 # 只激活预处理&#xff0c;不会自…

装机摸鱼日记01--DDR3AMD专用内存+QHQF(6400T)试水

前些日子在某鱼入手了两条AMD专用内存&#xff0c;宏想的DDR3-1600MHz-8G内存和一块高贵阿苏斯Z170-P-D3主板&#xff0c;然后某宝600多买了一颗QHQF&#xff08;当然也可以玩QHQJ&#xff0c;更便宜&#xff0c;估计三百多&#xff09;&#xff0c;准备超频玩玩看&#xff0c;…

HDU 多校 6400 Parentheses Matrix(构造)

HDU 多校 6400 Parentheses Matrix(构造) // Problem: D. Parentheses Matrix // Contest: Codeforces - 2018 Chinese Multi-University Training, Nanjing U Contest // URL: https://codeforces.ml/gym/102192/problem/D // Memory Limit: 128 MB // Time Limit: 1000 ms //…

联发科mtk和骁龙730哪个好_联发科G90T处理器和骁龙730哪个好 联发科G90T处理器跑分怎么样...

7月30日&#xff0c;联发科以「游戏芯生∙战力觉醒」为主题举行了新品发布会&#xff0c;正式推出了首款专门为手游定制的移动处理器Helio G90T。作为一款专攻游戏的处理器&#xff0c;Helio G90T搭载了联发科研发的游戏优化引擎技术MediaTek HyperEngine。该技术从手机游戏网络…