目录
CMake都有什么?
使用cmake一般流程为:
1 生成构建系统
使用命令在build外编译代码:
cmake基本语法
指定使用最低版本的cmake
指定项目名称
指定生成目标文件的名称
指定C++版本
cmake配置文件使用
cmake配置文件生成头文件
版本号定义方法一:
版本号定义方法二:
如果想在cmake文件中定义变量,代码中使用值
参考:
CMake提供cmake、ctest和cpack三个命令行工具分别负责构建、测试和打包。本文主要介绍cmake命令。
生成构建系统(buildsystem,比如make工具对应的Makefile);
执行构建(比如make),生成目标文件;
执行测试、安装或打包。
通过cmake
命令生成构建系统。
通过cmake --help
可以看到cmake命令支持的详细参数,常用的参数如下:
参数 | 含义 |
---|---|
-S | 指定源文件根目录,必须包含一个CMakeLists.txt 文件 |
-B | 指定构建目录,构建生成的中间文件和目标文件的生成路径 |
-D | 指定变量,格式为-D = |
demo1:
1.是配置时间,2是构建时间.
至于为什么在cmake后加 -G "Unix Makefiles"是因为我使用的是win10系统,如果不加这个,cmake会编程成VS2015的sln文件.
cmake -S . -B build
上面的是编译生成makefile文件,你还需要cd进build文件make一下才可以生成可执行文件,其实也可以不进入build文件就可以编译.就是在使用下面的命令.
cmake --build build
这个命令就是编译命令,需要注意的是,第一个 --build是必须写的,第二个build是生成makefile的文件夹,如果你存放的makefile文件夹不是build而是 qwer你的命令应该是这么写
cmake --build qwer
cmake_minimum_required(VERSION 3.20)
project(Tutorial)
add_executable(Tutorial tutorial.cxx)
设置C++11 版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
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的配置文件生成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文件中定义一个变量:
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