持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情。 写文章不易,阅读之前请给我点个赞吧~
一、初识CMake
CMake是一个管理源代码构建的工具。最初,CMake被设计为 Makefile 的各种语言的生成器,今天CMake生成现代的构建系统,如 Ninja,以及 IDEs 的项目文件,如 Visual Studio 和 Xcode。CMake 广泛用于 C 和 c++ 语言,但它也可以用于构建其他语言的源代码。第一次接触CMake的人可能有不同的初始目标。要了解如何构建从互联网下载的源代码包,请从用户交互指南开始。这将详细说明运行cmake(1)或cmake-gui(1)可执行文件所需的步骤,以及如何选择生成器,以及如何完成构建。使用依赖指南针对的是希望开始使用第三方库的开发人员。对于使用 CMake 开始一个项目的开发人员来说,CMake教程是一个合适的起点。CMake -buildsystem(7)手册旨在帮助开发人员扩展维护构建系统的知识,熟悉可以在CMake中表示的构建目标。cmake-packages(7)手册解释了如何创建可以被基于cmake的第三方构建系统轻松使用的包。更多详细内容可以参看CMake官方指南。
1.1 主要特点:
- 开源跨平台
- 构建(build)、测试(test)和打包软件(package software)的工具软件
- cmake 的配置文件简单易懂,不依赖其他平台和编译器
- 使用cmake配置文件来控制程序的编译过程,并生成 native makefile 和 workspace
1.2 基本工作流程
graph LR
CMakeLists.txt --> camke --> Makefile --> make --> exe
二、认识最简单的 CMakeLists.txt
最简单的 CMakeLists.txt
只需要包含三个命令。这里给出例子:
cmake_minimum_required (VERSION 3.10)
# set the project name
project (helloworld)
# add the executable
add_executable (hello main.cpp)
2.1 cmake_minimum_required()
命令
任何项目的最顶层 CMakeLists.txt 必须首先使用指定最低 CMake 版本cmake_minimum_required()
命令。这将建立策略设置并确保以下 CMake 函数使用兼容版本的 CMake 运行。如果 CMake 的运行版本低于<min>
要求的版本,它将停止处理项目并报告错误。
2.2 project()
命令
设置项目名称,这里项目名称为 helloworld 。
2.3 add_executable()
命令
告诉 CMake 使用指定的源代码文件创建可执行文件,这里使用 main.cpp 来构建名为 hello 的可执行文件。
三、编译单文件文档
配合一段之前使用过的简单的 C++ 代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void func(string &str)
{
str += "a";
}
int main()
{
vector<string> b= { "str", "ghjhk", "2"};
for(int i = 0; i < b.size(); i++)
{
string a=b[i];
func(a);
}
cout << "success" << endl;
return 0;
}
下面我们尝试使用 CMake 编译,你只需要准备下面两个文件
mkdir build
接下来,进入 build 目录并运行 CMake 来配置项目并生成原生构建系统,其中使用cmake ../
是使用 上级文件夹下的 CMakeLists.txt 文件作为起始点在当前目录中生成 makefile。
cd build
cmake ../
【补充】cmake用法
cmake [options] <path-to-source> #源码目录,也就是上面的../ 即CMakeLists.txt所在文件夹路径
cmake [options] -S <path-to-source> -B <path-to-build> #用于大型工程,有很多CMakeLists.txt所以需要具体指定,避免混乱
cmake --build .
四、增加更多配置,完善 CMakeLists.txt
4.1 添加版本号
在上述的设置项目名称的同时,赋予当前项目版本号这个是 1.0
# set the project name and version
project(Tutorial VERSION 1.0)
4.2 增加源码路径(相对路径)
将原来的
# add the executable
add_executable(hello main.cpp)
改为,意为把当前路径(.)下的 .cpp 文件编译生成名为 hello 的二进制可执行文件
# add the executable
aux_source_directory(. src_list)
add_executable(hello ${src_list})
这样做当我们修改 cpp 文件的名称的时候就不用修改 CMakeLists.txt 文件了,十分方便,通过下面的过程也可以看出这是基于vs2022构建的项目
4.3 目录结构
这样做的目的是,便于删除 build文件,保持代码简洁
helloworld
├── build
├── CMakeLists.txt
└── main.cpp
4.4 其他状况:无法 make
尝试在这个网页中下载