Modern CMake 简单使用目录结构 ├── CMakeLists.txt ├── main.cpp └── threadpool ├── CMakeLists.txt ├── threadpool.cpp └── threadpool.h 第1个CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
project(test_tp VERSION 0.0.1)
message("PROJECT_NAME: ${PROJECT_NAME}")
message("PROJECT_VERSION: ${PROJECT_VERSION}")
message("PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message("PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message("test_tp_VERSION:${test_tp_VERSION}")
message("test_tp_SOURCE_DIR: ${test_tp_SOURCE_DIR}")
message("test_tp_BINARY_DIR:${test_tp_BINARY_DIR}")
if (PROJECT_BINARY_DIR STREQUAL PROJECT_SOURCE_DIR)
message(MARNING "The binary directory of CMake cannot be the same as source directory.")
endif ()
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_subdirectory(threadpool)
add_executable(test_tp)
aux_source_directory(. SRC_LIST)
target_sources(test_tp PRIVATE ${SRC_LIST})
target_link_libraries(test_tp PRIVATE ThreadPool)
第2个CMakeLists.txt message("threadpool CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
add_library(ThreadPool OBJECT)
find_package(Threads REQUIRED)
target_sources(ThreadPool PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/threadpool.cpp)
target_link_libraries(ThreadPool PRIVATE Threads::Threads)
target_include_directories(ThreadPool INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
常用命令: cmake -B build 在源码目录用 -B 直接创建 build 目录并生成 build/Makefilecmake --build build -j4 自动调用本地的构建系统在 build 里构建,即:make -C build -j4sudo cmake --build build --target install 调用本地的构建系统执行 install 这个目标,即安装
CMAKE_BUILD_TYPE 构建的类型,调试模式还是发布模式 - CMAKE_BUILD_TYPE 是 CMake 中一个特殊的变量,用于控制构建类型,他的值可以是:
- Debug 调试模式,完全不优化,生成调试信息,方便调试程序
- Release 发布模式,优化程度最高,性能最佳,但是编译比 Debug 慢
- MinSizeRel 最小体积发布,生成的文件比 Release 更小,不完全优化,减少二进制体积
- RelWithDebInfo 带调试信息发布,生成的文件比 Release 更大,因为带有调试的符号信息
- 默认情况下 CMAKE_BUILD_TYPE 为空字符串,这时相当于 Debug。
操作: - 在配置build时,
cmake -B build -DCMAKE_BUILD_TYPE=Release. 注意:在配置阶段可以通过 -D 设置缓存变量。第二次配置时,之前的 -D 添加仍然会被保留。也就是如果设置了Release后,要变回Debug,需要再次执行cmake -B build -DCMAKE_BUILD_TYPE=Debug - 在CMakeLists.txt中设置
set(CMAKE_BUILD_TYPE Release)
PUBLIC,PRIVATE,INTERFACE,定义了Target属性的传递范围 - PUBLIC 对于可执行文件而言意义不大,对于库来说,它让 CMake 知道链接这个目标的目标也需要这个。也就是 “我自己要用,其他链接我的也要用”,具有传递性
- PRIVATE 表示 “我自己用,其他人不用”
- INTERFACE 表示 “我自己不用,其他链接我的要用”
|