CMake 初步使用

CMake 是一个跨平台的构建系统生成工具,它可以根据简单的配置文件(CMakeLists.txt)生成不同平台的构建文件(如 Makefile、Visual Studio 项目文件等)。对于 C/C++ 项目,掌握 CMake 的基本使用能极大简化跨平台开发流程。

一、CMake 基本概念

  • CMakeLists.txt:CMake 的配置文件,描述项目的构建规则

  • 构建目录:存放生成的构建文件和编译产物的目录,通常建议与源代码分离

  • 生成器:CMake 支持的不同构建系统(如 Unix Makefiles、Visual Studio、Xcode 等)

  • 目标(Target):CMake 中要构建的实体(可执行文件、库等)

二、安装 CMake

  • Windows:从 CMake 官网 下载安装包,勾选 "Add CMake to the system PATH"

  • Linux:通过包管理器安装 sudo apt install cmake(Debian/Ubuntu)或 sudo yum install cmake(CentOS)

  • macOS:使用 Homebrew 安装 brew install cmake

验证安装:cmake --version 应显示版本信息

三、最简单的 CMake 项目

3.1 项目结构

创建一个简单的 C++ 项目,结构如下:

1
2
3
hello_cmake/
├── CMakeLists.txt
└── main.cpp

3.2 编写代码

main.cpp 内容:

1
2
3
4
5
6
#include <iostream>

int main() {
std::cout << "Hello, CMake!" << std::endl;
return 0;
}

CMakeLists.txt 内容:

1
2
3
4
5
6
7
8
# 规定 CMake 最低版本
cmake_minimum_required(VERSION 3.10)

# 项目名称
project(HelloCMake)

# 添加可执行目标:将 main.cpp 编译为 hello 可执行文件
add_executable(hello main.cpp)

四、使用 CMake 构建项目

4.1 命令行构建(推荐)

创建并进入构建目录(out-of-source build,避免污染源代码):

1
2
mkdir build
cd build

生成构建文件

1
2
3
4
5
# 基本用法:生成默认构建系统(如 Linux 上的 Makefile)
cmake ..

# 指定编译类型(Debug/Release)
# cmake .. -DCMAKE_BUILD_TYPE=Release

编译项目

1
2
# 使用 Makefile 时
make

运行程序

1
./hello

4.2 预期输出

1
Hello, CMake!

五、稍复杂的项目:包含多个源文件

5.1 项目结构

1
2
3
4
5
math_project/
├── CMakeLists.txt
├── main.cpp
└── math_functions.cpp
└── math_functions.h

5.2 代码实现

math_functions.h:

1
2
3
4
5
6
7
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H

int add(int a, int b);
int multiply(int a, int b);

#endif

math_functions.cpp:

1
2
3
4
5
6
7
8
9
#include "math_functions.h"

int add(int a, int b) {
return a + b;
}

int multiply(int a, int b) {
return a * b;
}

main.cpp:

1
2
3
4
5
6
7
8
9
#include <iostream>
#include "math_functions.h"

int main() {
int a = 3, b = 4;
std::cout << a << " + " << b << " = " << add(a, b) << std::endl;
std::cout << a << " * " << b << " = " << multiply(a, b) << std::endl;
return 0;
}

5.3 编写 CMakeLists.txt

1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 3.10)
project(MathProject)

# 添加可执行目标,包含多个源文件
add_executable(math_app
main.cpp
math_functions.cpp
)

5.4 构建并运行

1
2
3
4
mkdir build && cd build
cmake ..
make
./math_app

输出:

1
2
3 + 4 = 7
3 * 4 = 12

六、常用 CMake 命令

项目设置

1
2
cmake_minimum_required(VERSION 3.10)  # 最低版本要求
project(MyProject VERSION 1.0 LANGUAGES CXX) # 项目名称、版本、语言

添加目标

1
2
3
add_executable(myapp src1.cpp src2.cpp)  # 可执行文件
add_library(mylib STATIC src3.cpp) # 静态库
add_library(mylib SHARED src3.cpp) # 动态库

链接库

1
target_link_libraries(myapp mylib)  # 将 mylib 链接到 myapp

设置 C++ 标准

1
2
set(CMAKE_CXX_STANDARD 11)          # 设置 C++ 标准
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用指定标准

添加包含目录

1
target_include_directories(myapp PUBLIC include/)  # 添加头文件目录

七、CMake 构建流程总结

  • 编写源代码和 CMakeLists.txt
  • 创建并进入构建目录(mkdir build && cd build)
  • 运行 cmake .. 生成构建文件
  • 运行 make(或其他构建命令)编译项目
  • 运行生成的可执行文件

CMake 的核心思想是 "一次编写,到处构建",通过简单的配置文件就能在不同平台上生成合适的构建系统,非常适合跨平台项目开发。对于更复杂的项目(如包含第三方库、多目录结构),可以逐步学习 CMake 的高级特性。