现代 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
去找,方便配合包管理器