目录

  1. 高级特性概述
  2. CMake模块与查找库
  3. 构建配置与条件
  4. 目标属性与依赖管理
  5. 跨平台构建与交叉编译
  6. 外部项目与自定义构建步骤
  7. CMake的生成器与构建工具
  8. 参考资料

高级特性概述

CMake 是一个非常强大的工具,除了基本的构建流程外,它还支持许多高级功能,能够帮助开发者更加灵活地管理和定制项目的构建过程。这些特性包括查找库和模块、条件语句、目标属性管理、跨平台支持、外部项目构建等。通过这些功能,CMake 能够满足大规模项目、跨平台开发以及复杂构建需求的需求。


CMake模块与查找库

find_package

find_package 是 CMake 用于查找外部库和模块的命令。CMake 提供了许多预定义的模块来查找常见的库(如 Boost、OpenGL、Qt 等)。它通过搜索标准路径、查找库文件、头文件、配置文件等来确定库的位置。

find_package(Boost 1.70 REQUIRED)
find_package(OpenGL REQUIRED)

在使用 find_package 时,可以指定库的最低版本要求以及是否为必需项。例如:

find_package(Boost 1.70 REQUIRED COMPONENTS filesystem)

这将查找 Boost 1.70 或更高版本,并确保包含 filesystem 组件。如果未找到,构建过程将失败。

自定义查找模块

有时,CMake 并没有提供内置的模块来查找某些库。此时,可以编写自定义的查找模块。在 CMakeModules 目录下创建一个 .cmake 文件并编写查找逻辑。

例如,假设我们要查找 MyLibrary,可以创建一个 FindMyLibrary.cmake 文件:

find_path(MYLIBRARY_INCLUDE_DIR MyLibrary.h)
find_library(MYLIBRARY_LIBRARY NAMES MyLibrary)

然后在 CMakeLists.txt 中使用:

find_package(MyLibrary REQUIRED)


构建配置与条件

生成多种构建配置

CMake 允许为项目生成多种构建配置,例如调试和发布版本。可以通过 CMAKE_BUILD_TYPE 设置生成的构建类型:

cmake -DCMAKE_BUILD_TYPE=Debug ..

CMAKE_BUILD_TYPE 可以是以下几种:

  • Debug:生成带有调试信息的版本。
  • Release:生成优化过的发布版本。
  • RelWithDebInfo:生成带有调试信息的优化版本。
  • MinSizeRel:生成最小体积的优化版本。

条件语句与选项

CMake 支持条件语句和选项设置,以便根据不同的需求做出不同的构建决策。

  • 条件判断:
if(MY_OPTION)
  message(STATUS "MY_OPTION is ON")
else()
  message(STATUS "MY_OPTION is OFF")
endif()

  • 选项定义:
option(MY_OPTION "Enable feature X" ON)

这将定义一个选项 MY_OPTION,默认为 ON,并允许用户在配置时开启或关闭某个功能。


目标属性与依赖管理

target_link_libraries

target_link_libraries 命令用于将库链接到目标(如可执行文件或库)。它可以指定静态库、共享库、系统库以及目标间的依赖关系。

target_link_libraries(MyExecutable PRIVATE Boost::Boost)

该命令会将 Boost::Boost 库链接到 MyExecutable 可执行文件中。

target_include_directories

target_include_directories 用于为目标指定包含目录,即编译器在编译过程中查找头文件的路径。

target_include_directories(MyExecutable PRIVATE /path/to/include)

target_compile_options

target_compile_options 可以为目标指定特定的编译选项。例如,启用所有的警告:

target_compile_options(MyExecutable PRIVATE -Wall)


跨平台构建与交叉编译

跨平台构建

CMake 支持跨平台构建,可以根据不同平台的需求自动选择编译器、工具链等。例如,在 Linux 上使用 GCC 编译器,在 Windows 上使用 MSVC 编译器。

通过设置 CMake 工具链文件,可以指定不同平台或交叉编译的配置:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..

交叉编译

交叉编译指的是在一种平台上为另一种平台生成代码。CMake 支持通过工具链文件进行交叉编译配置。

例如,假设我们想为 ARM 架构编译项目,可以编写一个工具链文件 toolchain-arm.cmake,指定交叉编译工具链:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER /path/to/arm-gcc)
set(CMAKE_CXX_COMPILER /path/to/arm-g++)

然后通过以下命令进行交叉编译:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-arm.cmake ..


外部项目与自定义构建步骤

ExternalProject

CMake 提供了 ExternalProject 模块,用于在构建过程中下载、构建和安装外部项目。这对集成第三方库非常有用。

include(ExternalProject)

ExternalProject_Add(
    MyLibrary
    GIT_REPOSITORY https://github.com/user/mylibrary.git
    GIT_TAG master
    PREFIX ${CMAKE_BINARY_DIR}/_deps
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/install
)

add_custom_command

add_custom_command 用于执行自定义命令(如运行脚本、生成文件等)。它可以在构建过程中生成文件或执行其他操作。

add_custom_command(
    OUTPUT myfile.txt
    COMMAND python generate_file.py
    DEPENDS generate_file.py
    COMMENT "Generating myfile.txt"
)


CMake的生成器与构建工具

CMake 支持多种构建工具和生成器。例如,makeNinjaVisual Studio 等。通过 -G 选项,可以选择要使用的生成器:

cmake -G "Unix Makefiles" ..
cmake -G "Ninja" ..

也可以在 Windows 上使用 Visual Studio 生成器:

cmake -G "Visual Studio 16 2019" ..


参考资料