CMake 基础

CMake 基础教程:从零开始掌握核心概念

CMake 是现代 C/C++ 项目最主流的构建系统工具,它不直接编译代码,而是根据你写的 CMakeLists.txt 文件生成平台原生的构建脚本(如 Makefile、Ninja、Visual Studio 项目等)。本篇聚焦基础,帮助你快速上手最常用的命令和写法。

1. CMake 的基本工作流程

  1. 编写 CMakeLists.txt(项目配置文件)
  2. 在构建目录执行:
   cmake <源码路径>    # 配置阶段:生成构建系统(Makefile 等)
   cmake --build .     # 构建阶段:真正编译

推荐始终使用源码外构建(out-of-source build):

mkdir build
cd build
cmake ..             # .. 表示源码目录
cmake --build .

2. 最简 Hello World 项目

项目结构:

hello/
├── CMakeLists.txt
└── main.cpp

main.cpp

#include <iostream>
int main() {
    std::cout << "Hello CMake!" << std::endl;
    return 0;
}

CMakeLists.txt(基础必备三行)

cmake_minimum_required(VERSION 3.10)  # 1. 指定 CMake 最低版本

project(HelloCMake                      # 2. 定义项目名称(可选指定语言)
    VERSION 1.0
    DESCRIPTION "My first CMake project"
    LANGUAGES CXX)                      # 只启用 C++(默认启用 C 和 CXX)

add_executable(hello main.cpp)          # 3. 生成可执行目标 hello

构建运行:

mkdir build && cd build
cmake ..
cmake --build .
./hello   # Linux/macOS
# 或 hello.exe   # Windows

3. 核心基础命令详解

命令作用常用写法
cmake_minimum_required(VERSION x.y)指定 CMake 最低版本,避免旧版本兼容问题cmake_minimum_required(VERSION 3.15)
project(name)定义项目名称、版本、描述、语言project(MyApp LANGUAGES CXX C)
add_executable(target sources...)创建可执行文件目标add_executable(app main.cpp util.cpp)
add_library(target [STATIC|SHARED|MODULE] sources...)创建库目标add_library(mylib STATIC src.cpp)
add_library(mylib SHARED src.cpp)
target_include_directories(target scope dirs...)为目标添加头文件搜索路径target_include_directories(app PRIVATE include)
target_link_libraries(target scope libs...)为目标链接库target_link_libraries(app PRIVATE pthread fmt)
set(CMAKE_CXX_STANDARD 17)全局设置 C++ 标准set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

scope(作用域)说明

  • PRIVATE:只影响当前目标(编译时使用)
  • INTERFACE:只影响依赖当前目标的其他目标
  • PUBLIC:两者都影响(最常用)

4. 指定 C++ 标准(非常重要)

推荐方式(现代 CMake):

# 方法1:全局设置(简单)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 方法2:目标级别(更灵活,推荐)
target_compile_features(myapp PRIVATE cxx_std_17)  # 支持 11/14/17/20/23

5. 多文件项目基础示例

项目结构:

myapp/
├── CMakeLists.txt
├── main.cpp
├── include/
│   └── utils.h
└── src/
    └── utils.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(MyApp LANGUAGES CXX)

add_executable(myapp
    main.cpp
    src/utils.cpp
)

target_include_directories(myapp PRIVATE include)  # 添加 include 目录
target_compile_features(myapp PRIVATE cxx_std_17)

6. 基础变量一览

变量含义示例
${PROJECT_NAME}项目名称MyApp
${CMAKE_SOURCE_DIR}项目根源码目录/path/to/myapp
${CMAKE_BINARY_DIR}构建目录/path/to/myapp/build
${CMAKE_CURRENT_SOURCE_DIR}当前 CMakeLists.txt 所在目录用于子目录
${CMAKE_CXX_COMPILER}使用的 C++ 编译器g++ / clang++ / cl.exe

7. 常用构建类型

cmake .. -DCMAKE_BUILD_TYPE=Debug    # 调试版(带 -g)
cmake .. -DCMAKE_BUILD_TYPE=Release  # 发布版(带 -O3)

在多配置生成器(如 Visual Studio)中,可在 IDE 中切换 Debug/Release。

8. 基础小结 checklist

一个合格的基础 CMakeLists.txt 通常包含:

cmake_minimum_required(VERSION 3.15)           # 现代版本起点

project(MyProject
    VERSION 1.0
    LANGUAGES CXX)

add_executable(${PROJECT_NAME}                 # 使用项目名作为目标名
    main.cpp
    src/file1.cpp
    src/file2.cpp)

target_include_directories(${PROJECT_NAME} PRIVATE include)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)

掌握以上内容,你已经能管理 90% 的小型到中型 C++ 项目了!

后续可以继续学习:

  • 子目录管理(add_subdirectory()
  • 查找外部库(find_package()
  • 安装规则(install()
  • 测试(add_test() + CTest)

如果你想看更具体的例子(如添加第三方库、静态/动态库分离、多目录结构等),随时告诉我,我继续深入讲解!

文章已创建 3511

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部