1 创建 CMake 项目

1.1 安装 CMake

一般情况下通过包管理器安装即可,但在某些 Linux 发行版中通过这种方式安装的 CMake 版本较旧。

# Debian / Ubuntu
sudo apt install cmake

1.2 创建 CMakeLists.txt

在项目根目录下创建 CMakeLists.txt。它指导 CMake 组织整个项目结构。

1.3 简单的配置结构

以下是一个最基本的 CMakeLists.txt

# 指定本项目所需 CMake 的最低版本
cmake_minimum_required(VERSION 3.28.0)

# 本项目名为 “MyProject”
project(MyProject)

# 添加目标、源文件
add_executable(target_name src/main.cpp)

第一行代码指定了构建本项目所需的最低 CMake 版本。如果你难以抉择,可以填 3.28.0。如果你比较激进,可以填你当前安装的最新版本(推动行业进步)。

第二行代码给本项目随便起个名字。

第三行代码中的 target_name 是目标名称,也是编译出的可执行文件名,main.cpp 是源代码文件名。假如你的源代码文件在 src 目录下,需写成 src/main.cpp

1.4 CMake 预设

CMake 3.19 引入了预设。通过 CMakePresets.json,可以预先设定编译器和生成器(Generators)等操作,简化配置项目的命令。

CMakePresets.jsonCMakeLists.txt 应放在同一目录下。

下面是一个简单的 CMake 预设框架,显式指定了生成器和编译器:

{
  "version": 8,
  "configurePresets": [
    {
      "name": "default",
      "hidden": true,
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
      },
      "environment": {
        "CC": "gcc",
        "CXX": "g++"
      }
    },
    {
      "name": "ninja-debug",
      "inherits": "default",
      "displayName": "Ninja Debug",
      "description": "Ninja Debug",
      "generator": "Ninja",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      }
    },
    {
      "name": "ninja-release",
      "inherits": "default",
      "displayName": "Ninja Release",
      "description": "Ninja Release",
      "generator": "Ninja",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    }
  ]
}

要查看当前可用的生成器,执行:cmake --help,CMake 会在输出内容的最后向你展示本机可用的生成器。

1.5 配置项目

每次修改完 CMakeLists.txtCMakePresets.json 后都需要先 “配置” 才能编译生成可执行文件:

cmake -B build --preset ninja-debug

1.6 构建 / 生成

cmake --build build/

2 vcpkg 包管理器

2.1 配置环境变量

先设置环境变量 VCPKG_ROOT 为 vcpkg 的安装路径。

# ~/.bashrc
export VCPKG_ROOT=
export PATH=$VCPKG_ROOT:$PATH

记得 source ~/.bashrc

2.2 在 CMake 中使用 vcpkg 工具链

CMakePresets.json configurePresets 的默认预设中添加:

"toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"

2.3 创建 vcpkg 依赖清单

在项目根目录或 CMakeLists.txt 的同级目录中运行:

vcpkg new --application

添加依赖项:

vcpkg add port package-name

2.4 添加外部包引用

以下内容加到 project() 之后:

find_package(glfw3 CONFIG REQUIRED)
target_link_libraries(target_name PRIVATE glfw)

2.5 重新配置项目

按照步骤 1.5 重新配置项目时,vcpkg 会自动将外部包安装到项目目录 build/vcpkg_installed 中。