初识CMake之使用CMakeLists.txt编译单文件C++源码

1,328 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 编译,你只需要准备下面两个文件

image.png

在当前的工程目录(也就是上面两个文件的所在文件夹目录)打开命令行工具 git ,创建一个本地构建目录 build
 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构建的项目

image.png

4.3 目录结构

这样做的目的是,便于删除 build文件,保持代码简洁

helloworld
├── build
├── CMakeLists.txt
└── main.cpp

4.4 其他状况:无法 make

尝试在这个网页中下载

image.png

解压后,将下面四个文件夹放到 Git 的安装位置:这里是 “C:\Program Files\Git\mingw64”

image.png