CMake 基础

CMake 是一个跨平台的构建系统,可以管理项目的编译过程。它通过使用简单的配置文件(CMakeLists.txt)来定义项目结构和构建规则。

CMakeLists.txt 基本结构

  • cmake_minimum_required: 指定项目所需的最低 CMake 版本。

    cmake_minimum_required(VERSION 3.10)
  • project: 定义项目名称和语言。

    project(MyProject LANGUAGES CXX)
  • add_executableadd_library: 添加可执行文件或库。

    add_executable(MyExecutable main.cpp)

常用命令

  • set: 设置变量值。

    set(SOURCE_FILES main.cpp helper.cpp)
  • include_directories: 添加头文件搜索路径。

    include_directories(${PROJECT_SOURCE_DIR}/include)
  • target_link_libraries: 链接库到目标。

    target_link_libraries(MyExecutable MyLibrary)

使用外部库

CMake 支持多种方式来引入外部库,例如使用 find_packagefind_library 命令。

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(MyExecutable ${OpenCV_LIBS})

构建与安装

CMake 提供了一套标准化的构建与安装过程,通常包括以下步骤:

  1. 创建构建目录并进入目录:

    mkdir build && cd build
  2. 使用 CMake 配置项目:

    cmake ..
  3. 编译项目:

    make
  4. 安装生成的二进制文件:

    make install

跨平台支持

CMake 的一大优势在于其跨平台支持。在不同的平台上,CMake 可以生成适合该平台的原生构建系统,如 Unix Makefiles、Ninja、Visual Studio 项目等。

# 在 Windows 上生成 Visual Studio 项目 
cmake -G "Visual Studio" ..
 
# 在 Linux 上使用 Ninja 构建系统 
cmake -G "Ninja" ..

高级特性

自定义命令和目标

可以使用 add_custom_commandadd_custom_target 来添加自定义步骤,例如生成代码或调用脚本。

条件语句和循环

CMake 支持条件判断和循环控制结构,使得配置更加灵活。

if(WIN32)
    message("This is Windows")
endif()
 
foreach(src IN LISTS SOURCE_FILES)
    message("Source file: ${src}")
endforeach()

模块与包管理

通过外部模块和包管理工具(如 CPM.cmake、vcpkg),可以更方便地管理依赖关系。