
CMake(Cross-Platform Make)是一个跨平台的构建系统生成器它生成平台的原生构建工具(如Makefile、Visual Studio工程、NinJa文件等并支持复杂项目、多平台和多编译环境。核心功能1、跨平台支持2、管理复杂项目结构子模块、依赖3、支持现代C特性4、集成第三方库5、自动生成安装包基本概念1、CMakeLists.txt每个目录的配置文件2、目标Target:可执行文件或库3、变量Variable存储路径、选项、版本号等4、生成器Generator决定生成哪种构建系统5、作用域Scope变量和目标在不同的目录或函数中的可见性二、CMake安装与版本管理1、linuxsudo apt install cmake # Ubuntu/Debain2、IOSbrew install cmake # MacOS3、windowschoco install cmake #Chocolaty4、检查版本cmake --version三、基本结构1、最小CMakeLists.txtcmake_minimum_required(VERSION 3.20)project(MyProject VERSION 1.0 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED True)add_executable(MyApp main.cpp)2、基本命令命令功能project()定义项目名称、语言和版本cmake_minimum_required(VERSION x.y)设置最低 CMake 版本add_executable( )添加可执行文件target_compile_options( )设置编译选项target_link_libraries( )链接库set( )设置变量message()输出信息四、变量与作用域1. 设置变量set(MY_VAR Hello)2.读取变量message(${MY_VAR})3.作用域CACHE:跨目录可见默认仅在当前目录可见PARENT_SCOPE:传递给父目录eg:set(MY_VAR Hello CACHE STRING A cached variable)五、目录与依赖管理1、添加目录add_executable(MyApp main.cpp)add_library(MyLib STATIC lib.cpp)2、目标属性PRIVATE仅当前目标PUBLIC当前目标 链接目标INTERFACE只作用于依赖目标eg:target_compile_definitions(MyLib PUBLIC USE_FEATURE_X)target_include_directories(MyLib PUBLIC include)target_link_libraries(MyApp PRIVATE MyLib)六、目录结构与子目录1.典型大型项目结构MyProject/├─ CMakeLists.txt├─ src/│ ├─ CMakeLists.txt│ └─ main.cpp├─ lib/│ ├─ CMakeLists.txt│ └─ mylib.cpp├─ include/│ └─ mylib.h├─ tests/│ └─ CMakeLists.txt└─ third_party/2.顶层 CMakeLists.txtcmake_minimum_required(VERSION 3.20)project(MyProject)add_subdirectory(lib)add_subdirectory(src)add_subdirectory(tests)七、条件编译与选项1.平台判断if(WIN32)message(Windows build)elseif(UNIX)message(Linux/Mac build)endif()2、选项开关option(USE_FEATURE_X Enable Feature X ON)if(USE_FEATURE_X)add_definitions(-DUSE_FEATURE_X)endif()八、查找外部依赖1.find_packagefind_package(Boost 1.82 REQUIRED COMPONENTS filesystem)target_link_libraries(MyApp PRIVATE Boost::filesystem)2.FetchContent下载源码include(FetchContent)FetchContent_Declare(googletestGIT_REPOSITORY GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework · GitHubGIT_TAG release-1.12.1)FetchContent_MakeAvailable(googletest)九、自定义命令与目标add_custom_command(OUTPUT generated.cppCOMMAND python generate.pyDEPENDS generate.py)add_executable(MyApp main.cpp generated.cpp)add_custom_target不生成文件但可执行自定义操作。十、安装与打包1.安装文件install(TARGETS MyApp DESTINATION bin)install(FILES myconfig.conf DESTINATION etc)2.生成包CPackinclude(CPack)十一、测试集成1.启用 CTestenable_testing()add_executable(test_app test.cpp)add_test(NAME MyTest COMMAND test_app)2.运行测试ctest --output-on-failure十二、生成与构建流程1.生成构建系统cmake -S . -B build -G Visual Studio 17 20222. 构建cmake --build build --config Release -- -j8十三、CMake 高级特性1.INTERFACE 库纯头文件库无源码add_library(MyHeaderLib INTERFACE)