CMake 详解
CMake 是一个开源的跨平台构建系统,设计用于自动化构建过程,尤其是用于管理跨平台项目的构建。在大型和复杂的项目中,CMake 非常有用,允许开发者通过一组简单的配置文件(CMakeLists.txt)来控制构建流程。
CMake 的主要功能是生成特定于平台的构建系统(如 Makefiles、Visual Studio 项目文件、Xcode 项目文件等),从而使开发者能够在多种操作系统和开发环境下轻松编译和构建项目。
1. CMake 的核心概念
1.1. 构建系统生成器
CMake 不直接构建项目,它的作用是生成平台相关的构建系统。生成器的类型取决于目标平台和你选择的工具链。例如,CMake 可以生成 GNU Makefiles(Linux)、Visual Studio 项目(Windows)、Xcode 项目(macOS)等。
1.2. 跨平台支持
CMake 是一个跨平台工具,可以生成适用于各种平台的构建文件。开发者只需编写一次 CMakeLists.txt,便可在不同的操作系统和开发环境中使用相同的项目配置文件进行构建。
1.3. 模块化和可扩展性
CMake 支持项目的模块化组织方式,可以轻松地处理项目中的多个子模块。CMake 还支持查找和链接外部库、设置构建选项、处理第三方依赖等。
2. CMakeLists.txt 配置文件
CMakeLists.txt 是 CMake 项目的核心配置文件,控制项目的构建流程。通常,每个 CMake 项目都至少包含一个 CMakeLists.txt 文件。这个文件定义了项目的名称、版本、源文件、依赖库、编译选项以及生成的可执行文件或库。
3. CMake 的主要命令
project()
project(MyProject)
该命令用于定义项目名称和项目的语言(如 C、C++、Fortran 等)。你可以通过 project() 指定项目的版本、编程语言以及描述信息。
add_executable()
add_executable(MyExecutable main.cpp other.cpp)
该命令用于指定要生成的可执行文件,并将多个源文件编译并链接成一个可执行文件。
add_library()
add_library(MyLibrary STATIC mylib.cpp)
用于创建库文件(静态库或动态库)。通过指定库的名称和源文件,CMake 会根据项目的设置生成相应类型的库。
target_link_libraries()
target_link_libraries(MyExecutable MyLibrary)
用于将某个库链接到指定的目标(如可执行文件或其他库)。
include_directories()
include_directories(${CMAKE_SOURCE_DIR}/include)
该命令用于指定头文件的搜索路径。当编译源文件时,编译器将会从这些指定的路径中查找头文件。
find_package()
find_package(SomeLibrary REQUIRED)
该命令用于查找并配置外部库或依赖项。如果库没有被找到,CMake 将会显示错误或警告。可以使用 find_package() 来自动找到库的头文件和库文件的位置。
4. 配置与编译流程
4.1. 配置阶段
配置阶段的主要任务是解析 CMakeLists.txt 文件并生成适合目标平台的构建系统(如 Makefiles、Visual Studio 项目等)。配置的命令通常为:
cmake -S . -B build
-S . 表示当前目录为源代码目录。
-B build 表示生成的构建文件将放置在 build 目录中。
CMake 还支持许多配置选项,例如设置编译器、构建类型、库路径等。
4.2. 编译阶段
配置完成后,你可以使用生成的构建文件来编译项目。例如,如果使用 Makefiles,编译命令为:
cmake --build build
这将会根据 CMakeLists.txt 文件中定义的目标和依赖关系编译项目。
5. CMake 的高级特性
5.1. 外部项目和依赖管理
CMake 支持通过 find_package() 和 ExternalProject 模块来查找和管理第三方库。CMake 还支持自动下载、编译和链接外部依赖库,使得项目的依赖管理变得更加容易。
5.2. 多平台构建
CMake 支持跨平台的构建流程。只需一个 CMakeLists.txt 文件,就可以在多个操作系统上生成相应的构建系统。例如:
- 在 Linux 上生成 Makefiles
- 在 Windows 上生成 Visual Studio 项目
- 在 macOS 上生成Xcode 项目
5.3. 生成选项控制
CMake 允许你通过命令行控制项目的生成选项,例如编译器、编译选项、编译模式(Debug 或 Release)等:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gcc -B build
5.4. 测试支持
CMake 原生支持测试框架,通过 enable_testing() 和 add_test() 可以轻松配置单元测试。例如,可以结合 CTest 进行自动化测试集成。
5.5. 安装与打包
CMake 提供 install() 命令用于安装编译后的文件(如可执行文件、库、头文件等)到系统指定目录。它还支持打包项目为平台相关的格式,如 .deb、.rpm、.msi 等。
install(TARGETS MyExecutable DESTINATION bin)
install(FILES myheader.h DESTINATION include)
6. CMake 的模块化与子项目管理
具体看这篇博客点击这里