cmake简易入门

构建步骤

  1. 创建 CMakeLists.txt 文件:定义项目、目标和依赖。
  2. 创建构建目录:保持源代码目录整洁。
  3. 配置项目:使用 CMake 生成构建系统文件。
  4. 编译项目:使用构建系统文件编译项目。
  5. 运行可执行文件:执行生成的程序。
  6. 清理构建文件:删除中间文件和目标文件。
    1
    2
    3
    4
    5
    6
    7
    配置CMakeLists.txt后
    mkdir build 创建目录
    cd build
    cmake .. # 配置
    make # 编译
    ./MyExcutable # 运行
    make clean # 清理

基本

  • cmake_minimum_required(VERSION <num>):设置最低版本

  • project(<name> [version]):设置项目名和版本

  • add_executable(<target> [dependence]):添加项目可执行文件和依赖

  • set(<var> <val>):设置变量

  • ${var}:变量使用

  • configure_file(<ifile> <ofile> [copy_only] [escape_quotes] [@only]):复制一个文件到目标位置,并对文件内容进行变量替换

    • ifile:指定输入文件的路径。
    • ofile:指定输出文件的路径
    • COPY_ONLY:如果指定这个选项,CMake将不会对文件内容进行变量替换,只是简单地复制文件。
    • ESCAPE_QUOTES:如果指定这个选项,CMake将对输出文件中的双引号进行转义。
    • @ONLY:如果指定这个选项,CMake将只替换@符号包围的变量。这在某些情况下可以提高性能。

添加库

  • find_package(<name> [version] REQUIRED [PATH [path]])

  • add_library(<name> [type] [exclude] [sources]):创建库或者接口目标

    • type:
      • STATIC:创建静态库(.a/.lib
      • SHARED:创建动态库(.so/.dll
      • MODULE:插件库(不被target_link_libraries链接)
      • INTERFACE:无编译输出的接口库
    • exclude:不从默认构建中包含此目标
1
2
add_library(math STATIC src/math.cpp)  # 静态库
add_library(core SHARED src/core.cpp) # 动态库
  • add_subdirectory(source_dir [binary_dir] [exclude]):添加子目录的cmake项目

    • source_dir:包含CMakeLists.txt的子目录
    • binary_dir:指定构建输出目录(默认同源目录)
  • target_include_directories(<target> [type] [dir] ):为目标添加头文件搜索路径

    • type:
      • PUBLIC:目标本身和依赖者都使用
      • PRIVATE:仅目标本身使用
      • INTERFACE:仅依赖者使用
    • dir:文件目录
1
2
3
4
target_include_directories(math
PUBLIC include # 使用者需要此路径
PRIVATE src # 仅内部实现需要
)
  • target_link_libraries(<target> [type] [lib])
    • PUBLIC:当前目标和使用者都需要
    • PRIVATE:仅当前目标需要
    • INTERFACE:仅使用者需要
    • lib:库目标名,即add_libraryname
  • PROJECT_SOURCE_DIR:默认参数,项目根目录

添加选项

  • if 条件语句

    1
    2
    3
    4
    5
    6
    7
    if(expression)
    # Commands
    elseif(expression)
    # Commands
    else()
    # Commands
    endif()
  • option(<var> "help" [init]):创建用户可配置的布尔选项

    • var:变量名
    • init:默认值
  • target_compile_definitions(<target> [type] [def]):添加预处理器宏定义

    1
    2
    3
    4
    target_compile_definitions(math
    PUBLIC USE_SSE3 # 传递给所有使用者
    PRIVATE DEBUG=1 # 仅内部调试使用
    )

为库添加使用要求

  • target_compile_options(<target> [type] [opt]):指定编译器选项

  • target_link_options(<target> [type] [opt]):指定链接器选项

  • target_precompile_headers(<name> [type] [header]):用于为目标指定预编译头文件

    1
    2
    add_executable(my_executable main.cpp utils.cpp)
    target_precompile_headers(my_executable PRIVATE <vector> <iostream>)
  • target_sources(<target> [type] [source]):为目标添加源文件

    1
    2
    add_executable(my_executable main.cpp utils.cpp)
    target_sources(my_executable PRIVATE additional.cpp)

使用接口库设置 C++ 标准

1
2
3
4
5
6
7
8
# 通过接口设置
add_library(cpp_standard INTERFACE)
target_compile_features(cpp_standard INTERFACE cxx_std_17)
target_link_libraries(math PUBLIC cpp_standard)

# 通过变量设置
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

添加生成器表达式

cmake-generator-expressions(7)

安装规则

  • install(TARGETS <targets> <var> )
    • val:
      • RUNTIME:可执行文件(Windows为.exe
      • ARCHIVE:静态库(.a/.lib
      • LIBRARY:共享库(.so/.dll
1
2
3
4
5
install(TARGETS math
ARCHIVE DESTINATION lib # 静态库安装到lib
LIBRARY DESTINATION lib # 动态库安装到lib
RUNTIME DESTINATION bin # 可执行文件安装到bin
)

测试支持

  • enable_testing():启用当前目录及子目录的测试功能

  • add_test(NAME <name> COMMAN <command> [args]):定义测试用例

  • function():定义函数

    1
    2
    3
    4
    5
    6
    7
    # 定义一个函数,用于打印消息
    function(print_message)
    message(STATUS "Hello, ${ARGV0}!")
    endfunction()

    # 调用函数
    print_message("World")
  • set_tests_properties([test] PROPERTIES [prop val])

    1
    2
    3
    4
    5
    set_tests_properties(math_test 
    PROPERTIES
    TIMEOUT 60 # 超时60秒
    LABELS "quick" # 测试分类标签
    )

资料

CMake官方教程
实战练习

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2025 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信