Appearance
CMake 入门
上一章我们学了 Makefile,但手写 Makefile 有个大问题:跨平台太麻烦。Linux 上用 gcc,Windows 上可能是 cl.exe,macOS 上可能是 clang——每个平台的编译器名称和参数都不一样。
CMake 就是为了解决这个问题诞生的。
CMake 是什么
CMake 是一个跨平台的构建系统生成器。它不直接编译代码,而是根据一份 CMakeLists.txt 配置文件,自动生成对应平台的 Makefile(或 Visual Studio 工程文件)。
CMakeLists.txt ──→ cmake ──→ Makefile(或 .sln)──→ make(或 MSBuild)──→ 可执行文件一个最简单的 CMakeLists.txt
还是用上一章的例子:main.c + add.c:
cmake
cmake_minimum_required(VERSION 3.10)
project(MyProgram)
add_executable(my_program main.c add.c)三行就搞定了。使用方式:
bash
# 在项目目录下
mkdir build && cd build
cmake .. # 生成 Makefile
make # 编译
./my_program # 运行为什么建
build目录? 把构建产物跟源码分开,保持源码目录干净。这叫"out-of-source build"。
进阶:静态库 + 可执行文件
实际项目通常会拆成库+主程序。来看一个例子:
目录结构:
project/
├── CMakeLists.txt
├── src/
│ ├── CMakeLists.txt
│ ├── main.c
├── lib/
│ ├── CMakeLists.txt
│ ├── add.c
│ ├── add.h根 CMakeLists.txt:
cmake
cmake_minimum_required(VERSION 3.10)
project(MyProgram)
add_subdirectory(lib)
add_subdirectory(src)lib/CMakeLists.txt:
cmake
add_library(mylib STATIC add.c)
# STATIC 生成静态库(.a / .lib)
# SHARED 生成动态库(.so / .dll)src/CMakeLists.txt:
cmake
add_executable(my_program main.c)
target_link_libraries(my_program mylib)
# 告诉链接器:my_program 需要 mylib常用命令速查
| 命令 | 作用 |
|---|---|
add_executable(name src1 src2 ...) | 生成可执行文件 |
add_library(name STATIC src ...) | 生成静态库 |
add_library(name SHARED src ...) | 生成动态库 |
target_link_libraries(A B) | A 链接 B |
target_include_directories(A PUBLIC dir) | 添加头文件搜索路径 |
find_package(PkgName) | 查找系统已安装的库 |
对比:手写 Makefile vs CMake
| Makefile | CMake | |
|---|---|---|
| 可读性 | 还行 | 更好 |
| 跨平台 | 要手写多套 | 自动适配 |
| 大型项目 | 复杂到崩溃 | 推荐 |
| 学习曲线 | 中等 | 中等偏低 |
| 生成 IDE 工程 | 不支持 | VS/Xcode 一键生成 |
bash
# CMake 给不同平台生成不同的构建系统
cmake -G "Unix Makefiles" .. # Linux
cmake -G "Visual Studio 17 2022" .. # Windows
cmake -G "Xcode" .. # macOS结合上一章的实操
如果你编译 CoolProp(下一章的综合案例),它的构建系统就是 CMake:
bash
git clone https://github.com/CoolProp/CoolProp.git
cd CoolProp
mkdir build && cd build
cmake ..
make小结
- Makefile 告诉你"构建规则怎么写"
- CMake 告诉你"构建规则怎么自动生成"
- 原则:自己写小项目用 Makefile 练手,实际项目用 CMake
下一章我们把这些知识串起来——用 SAM 或 CoolProp 完整实操一遍。