CMake使用教程

一、CMake 简介

CMake 是一个跨平台的构建工具,用于自动化生成不同平台(如 Makefile、Visual Studio、Xcode 等)的构建文件。它的核心是编写 CMakeLists.txt 文件,定义项目的构建规则。


二、安装 CMake

  • Linux:

    bash 复制代码
    sudo apt-get install cmake
  • Windows:

    下载安装包 CMake官网。

  • macOS:

    bash 复制代码
    brew install cmake

三、基础用法

1. 最小化 CMake 项目

创建一个 CMakeLists.txt 文件:

cmake 复制代码
cmake_minimum_required(VERSION 3.10) # 指定 CMake 最低版本

project(MyProject) # 项目名称

add_executable(my_app main.cpp) # 生成可执行文件
2. 构建项目
bash 复制代码
mkdir build && cd build # 创建构建目录(推荐)

cmake .. # 生成构建文件(如 Makefile)

make # 编译项目(Linux/macOS)

四、核心命令详解

1. 定义项目
cmake 复制代码
project(

  MyProject # 项目名

  VERSION 1.0.0 # 版本号(可选)

  LANGUAGES C CXX # 支持的语言(C/C++)

)
2. 添加可执行文件
cmake 复制代码
add_executable(

  my_app          

# 可执行文件名

  main.cpp # 源文件列表

  utils.cpp

)
3. 添加库
cmake 复制代码
# 静态库

add_library(my_lib STATIC lib.cpp)

# 动态库(SHARED)

add_library(my_lib SHARED lib.cpp)
4. 链接库到可执行文件
cmake 复制代码
target_link_libraries(my_app PRIVATE my_lib)
5. 包含头文件目录
cmake 复制代码
target_include_directories(

  my_app # 目标(可执行文件或库)

  PRIVATE # 作用域(PUBLIC/PRIVATE/INTERFACE)

  include # 头文件目录

)
6. 设置编译选项
cmake 复制代码
# 全局编译选项

add_compile_options(-Wall -Wextra)

# 目标专属选项

target_compile_options(my_app PRIVATE -O2)
7. 变量与条件判断
cmake 复制代码
set(MY_VAR "value") # 定义变量

if (WIN32)

  # Windows 平台特有配置

endif()

五、多目录项目结构

1. 子目录管理
复制代码
project/

├── CMakeLists.txt # 根目录

├── src/

│ ├── CMakeLists.txt

│ └── main.cpp

└── lib/

    ├── CMakeLists.txt

    └── my_lib.cpp

根目录的 CMakeLists.txt:

cmake 复制代码
cmake_minimum_required(VERSION 3.10)

project(MyProject)

add_subdirectory(lib) # 包含子目录

add_sadd_subdirectory(src)

子目录的 CMakeLists.txt(例如 src/CMakeLists.txt):

cmake 复制代码
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE my_lib)

六、常用变量

变量名 说明
CMAKE_CXX_STANDARD 设置 C++ 标准(如 11/14/17)
CMAKE_BUILD_TYPE 构建类型(Debug/Release)
CMAKE_CXX_COMPILER 指定编译器路径
PROJECT_SOURCE_DIR 项目根目录路径

示例:

cmake 复制代码
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE Debug)

七、进阶功能

1. 生成配置头文件
cmake 复制代码
configure_file(
  config.h.in           # 输入文件
  config.h              # 输出文件
)
2. 查找第三方库
cmake 复制代码
find_package(Boost REQUIRED COMPONENTS filesystem)
target_link_libraries(my_app PRIVATE Boost::filesystem)
3. 安装目标
cmake 复制代码
install(
  TARGETS my_app        # 安装可执行文件
  DESTINATION bin       # 安装路径(默认 /usr/local/)
)
4. 自定义命令
cmake 复制代码
add_custom_command(
  OUTPUT output_file
  COMMAND python3 script.py
  DEPENDS input_file
)

八、常见问题

1. 如何生成 IDE 项目(如 Visual Studio)?
bash 复制代码
cmake -G "Visual Studio 17 2022" ..
2. 如何清理构建文件?
bash 复制代码
rm -rf build/          # Linux/macOS
3. 如何启用调试信息?
cmake 复制代码
set(CMAKE_BUILD_TYPE Debug)

九、完整示例

项目结构
复制代码
demo/
├── CMakeLists.txt
├── include/
│   └── utils.h
├── src/
│   ├── main.cpp
│   └── utils.cpp
└── lib/
    └── math/
        ├── CMakeLists.txt
        ├── math.h
        └── math.cpp
根目录 CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.10)
project(DemoProject VERSION 1.0)

add_subdirectory(lib/math)   # 添加数学库
add_subdirectory(src)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
lib/math/CMakeLists.txt
cmake 复制代码
add_library(math STATIC math.cpp)
target_include_directories(math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
src/CMakeLists.txt
cmake 复制代码
add_executable(demo main.cpp utils.cpp)
target_include_directories(demo PRIVATE ../include)
target_link_libraries(demo PRIVATE math)

参考资料:

CMake文档:CMake Documentation。

​

相关推荐
JMchen2 天前
集成第三方 C/C++ 库到 Android NDK 项目:OpenCV 与 FFmpeg 实战指南
android·opencv·cmake
阿钱真强道15 天前
15 嵌入式操作系统 | 库的下载、编译、安装与验证(libubox / ubus / uci)
ubuntu·cmake·uci·ubus·libubox
阿钱真强道16 天前
22 嵌入式操作系统 | 串口命令行调试(socat / stty / printf / hexdump)
ubuntu·cmake·uci·ubus·libubox
五_谷_丰_登24 天前
cmake脚本学习——持续更新
脚本·cmake
程序员老陆25 天前
CMake 常用关键字与命令全景:从 set到 target_link_options的现代工程视角
c++·cmake·程序开发
idealzouhu1 个月前
现代 CMake 依赖管理详解:从构建树、Target 封装到 find_package 工作原理
c++·cmake
小王C语言1 个月前
cmake教程
c++·cmake
雾里看山1 个月前
源码目录、构建目录与 out-of-source build
c++·软件构建·cmake
ysu_03141 个月前
工具链通关02-CMake进阶超100个文件
cmake
十五年专注C++开发1 个月前
CMake基础:BUILD_INTERFACE 与 INSTALL_INTERFACE 完全解析
c++·cmake·build_interface