现代 CMake 实践

依然是 CMakeLists.txt

配置和构建的命令

  • 配置阶段: cmake -B build

    • -G 设置生成器,例如 -G ninja
  • 构建阶段:cmake --build build

    • -D 配置选项
      • -DCMAKE_BUILD_TYPE 可选 Debug / Release / MinSizeRel / RelWithDebInfo

设置版本

1cmake_min_required(VERSION 3.15)

设置 C++ 标准

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSION OFF)

CMAKE_CXX_EXTENSION 有一些 gcc 专用特性

不要使用 CMAKE_CXX_FLAGS 添加 std=c++17

创建和使用变量

1set(sources main.cpp other.cpp)
2target_source(main PUBLIC ${sources})

设置可执行文件构建目标

  • 第一种方式,直接关联到源文件:

    1add_executable(main main.cpp)
    
  • 第二种方式,分开写

    1add_executable(main)
    2target_source(main PUBLIC main.cpp other.cpp)
    

自动搜索源文件

1add_executable(main)
2file(GLOB sources CONFIGURE_DEPENDS *.cpp *.h)
3target_source(main PUBLIC ${sources})
  • CONFIGURE_DEPENDS 确保源文件变化后自动重新配置
1add_executable(main)
2aux_source_directory(. sources)
3aux_source_directory(mydir sources)
4target_source(main PUBLIC ${sources})

默认 Release

1if (NOT CMAKE_BUILD_TYPE)
2	set(CMAKE_BUILD_TYPE Release)
3endif()

设置项目名

project(helloworld)
project(helloworld VERSION 1.2.3)

库的生成和链接

静态

add_library(mylib STATIC mylib.cpp)
add_executable(main main.cpp)
target_link_libraries(main PUBLIC mylib)

动态库:改成 SHARED

对象库:改成 OBJECT(优点:比 STATIC 更轻量,不是真正的库,但很方便)

静态库无法链接到动态库,解决方法是静态 PIC 或者使用对象库。

链接别人的库D

target_link_libraries(main PUBLIC tbb)

会自动到 /usr/lib 去找库,去 /usr/include 找头。

或者

find_package(TBB CONFIG REQUIRED)
target_link_libraries(main PUBLIC TBB:tbb)

这样会到 /usr/lib/cmake/TBB/TBBConfig.cmake 去找,方便配合包管理器