CMake 是一种跨平台的构建系统工具,用于管理软件项目的构建过程。
它通过描述项目的构建配置生成本地构建系统文件(如 Makefile 或 Visual Studio 工程文件)。
核心概念
- CMakeLists.txt
每个项目目录都需要一个CMakeLists.txt
文件来定义构建规则。它是 CMake 的核心配置文件,描述了目标、依赖关系和构建步骤。 - 构建目录
CMake 通常在一个单独的目录中生成构建文件,保持源代码目录干净。 - 生成器(Generator)
CMake 根据目标平台和构建工具生成对应的构建文件。例如:
- Unix Makefiles
- Ninja
- Visiual Studio 工程文件
- 目标(Targets)
CMake 使用目标(如库和可执行文件)来组织构建过程。常见的目标包括add_executable
和add_library
。
基本语法
配置和版本要求
cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0 LANGUAGES CXX)
添加可执行文件或库
add_executable(MyApp main.cpp)
add_library(MyLib STATIC mylib.cpp)
指定源文件
可以直接写文件名或用变量引用:
set(SOURCES main.cpp helper.cpp)
add_executable(MyApp ${SOURCES})
链接库
target_link_libraries(MyApp PRIVATE MyLib)
设置编译选项
target_compile_options(MyApp PRIVATE -Wall -Wextra)
指定头文件目录
target_include_directories(MyApp PRIVATE include)
常用命令
- 项目管理
project()
:设置项目名称和属性。set()
:定义变量。
- 构建目标
add_executable()
和add_library()
。target_sources()
:动态添加源文件。target_compile_definitions()
:定义宏。
- 依赖管理
find_package()
:查找已安装的包。find_library()
:查找已安装的库。find_path()
:查找包含目录。
- 条件逻辑
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
message("Building for Linux")
endif()
- 自定义命令
add_custom_command(
OUTPUT generated_file.cpp
COMMAND python generate_code.py
DEPENDS generate_code.py
)
- 安装和打包
install()
:定义安装规则。cmake --install
: 安装到目标路径。- 打包工具如 CPack 用于生成
.deb
和.rpm
文件。
常见 CMake 变量
- 全局变量
CMAKE_C_COMPILER
: 设置 C 编译器。CMAKE_BUILD_TYPE
:构建类型(如 Debug、Release)。CMAKE_INSTALL_PREFIX
:安装路径。
- 目标相关变量
CMAKE_CXX_STANDARD
: C++ 标准(如11、14、17)。CMAKE_RUNTIME_OUTPUT_DIRECTORY
:可执行文件输出路径。
- 项目相关变量
PROJECT_SOURCE_DIR
:源码根目录。PROJECT_BINARY_DIR
:构建目录。
CMake 构建过程
- 配置阶段
执行以下命令生成构建文件:
cmake -S . -B build
-S
指定源码路径,-B
指定构建路径。
- 构建阶级
使用生成的构建文件进行编译:
cmake --build build
- 安装阶段
安装生成的文件到指定目录:
cmake --install build --prefix /path/to/install
示例:完整的 CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0 LANGUAGES CXX)
# 设置 c++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加可执行文件
add_executable(MyApp main.cpp)
# 链接外部库
find_package(Boost REQUIRED)
target_link_libraries(MyApp PRIVATE Boost::Boost)
# 设置安装规则
install(TARGETS MyApp DESTINATION bin)