2026/4/18 15:12:42
网站建设
项目流程
网站的命名规则,网络营销的重要性与意义,做电脑网站起什么名字,软件开发专科学校CMake 是一个跨平台的自动化构建系统#xff0c;用于管理软件构建过程。它使用独立于编译器的配置文件#xff08;CMakeLists.txt#xff09;来定义构建规则#xff0c;然后生成对应平台的本地构建文件#xff08;如 Makefile、Visual Studio 项目等#xff09;。
核心特…CMake 是一个跨平台的自动化构建系统用于管理软件构建过程。它使用独立于编译器的配置文件CMakeLists.txt来定义构建规则然后生成对应平台的本地构建文件如 Makefile、Visual Studio 项目等。核心特性1.跨平台支持Windows: 生成 Visual Studio 项目Linux/Unix: 生成 MakefilemacOS: 生成 Xcode 项目其他Ninja、MinGW 等2.主要功能模块CMake: 核心配置和生成工具CTest: 测试驱动工具CPack: 打包工具基本工作流程编写 CMakeLists.txt → cmake 配置生成构建系统文件 → 原生构建工具编译如 make/ninja/msbuild简单示例# CMakeLists.txt 最小示例 cmake_minimum_required(VERSION 3.10) project(MyProject VERSION 1.0) add_executable(myapp main.cpp)关键概念目标Targets# 创建可执行文件 add_executable(myapp main.cpp) # 创建库 add_library(mylib STATIC lib.cpp) # 静态库 add_library(mylib SHARED lib.cpp) # 动态库 add_library(mylib INTERFACE) # 接口库仅头文件库变量# 设置变量 set(MY_VARIABLE value) # 缓存变量可在 GUI 中修改 set(USE_FEATURE ON CACHE BOOL 启用特性) # 环境变量 set(ENV{PATH} /usr/local/bin:$ENV{PATH}) # 预定义变量 message(项目源目录: ${CMAKE_SOURCE_DIR}) message(构建目录: ${CMAKE_BINARY_DIR})条件判断if(WIN32) message(Windows 平台) elseif(APPLE) message(macOS 平台) elseif(UNIX) message(Linux/Unix 平台) endif() if(CMAKE_BUILD_TYPE STREQUAL Debug) set(DEBUG_FLAGS -g -O0) endif()循环# foreach 循环 foreach(item IN ITEMS a b c) message(项目: ${item}) endforeach() # 遍历文件列表 file(GLOB SOURCE_FILES src/*.cpp) foreach(src_file IN LISTS SOURCE_FILES) message(源文件: ${src_file}) endforeach()现代 CMake 最佳实践1.使用目标属性而非全局设置# 推荐做法现代 CMake add_library(mylib src/lib.cpp) target_include_directories(mylib PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include $INSTALL_INTERFACE:include ) target_compile_features(mylib PUBLIC cxx_std_17) target_link_libraries(mylib PUBLIC Threads::Threads) # 避免使用传统方式 include_directories(include) # 不推荐 link_directories(lib) # 不推荐2.依赖管理# 查找系统库 find_package(OpenCV REQUIRED COMPONENTS core imgproc) # 使用 FetchContent 获取外部项目 include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.11.0 ) FetchContent_MakeAvailable(googletest) # 链接库 target_link_libraries(myapp PRIVATE OpenCV::opencv GTest::gtest)常用命令速查项目配置命令cmake_minimum_required(VERSION 3.10) # 指定 CMake 最低版本 project(MyProject # 定义项目 VERSION 1.0.0 DESCRIPTION 我的项目 LANGUAGES C CXX ) # 设置 C 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)文件操作命令# 收集源文件 file(GLOB SOURCES src/*.cpp src/*.c) file(GLOB_RECURSE ALL_SOURCES src/**/*.cpp) # 复制文件 configure_file(config.h.in config.h) # 配置头文件 file(COPY data/ DESTINATION ${CMAKE_BINARY_DIR}/data)测试支持enable_testing() # 启用测试 add_test( NAME MyTest COMMAND mytest_exe arg1 arg2 ) # 添加测试用例 include(CTest) add_test(NAME FeatureTest COMMAND myapp --test-feature)典型项目结构myproject/ ├── CMakeLists.txt # 根 CMake 文件 ├── README.md ├── LICENSE ├── cmake/ # CMake 模块文件 │ ├── FindMyLib.cmake │ └── Config.cmake.in ├── include/ # 公共头文件 │ └── myproject/ │ └── mylib.h ├── src/ # 源代码 │ ├── CMakeLists.txt │ ├── main.cpp │ └── mylib.cpp ├── tests/ # 测试代码 │ ├── CMakeLists.txt │ └── test_mylib.cpp ├── examples/ # 示例代码 │ ├── CMakeLists.txt │ └── example1.cpp └── external/ # 外部依赖可选 └── CMakeLists.txt构建步骤示例# 1. 创建构建目录并进入mkdirbuildcdbuild# 2. 配置项目生成构建文件cmake..-DCMAKE_BUILD_TYPERelease -DUSE_FEATUREON# 3. 编译项目cmake --build.--config Release# 4. 运行测试ctest -C Release --verbose# 5. 安装可选cmake --install.--prefix /usr/localCMake 的优势真正的跨平台同一配置支持 Windows、Linux、macOS 等构建系统生成器不直接构建而是生成 Makefile、.sln 等依赖管理强大的 find_package 和现代 FetchContent模块化支持大型项目的模块化组织IDE 集成与 VS、CLion、VS Code 等完美集成活跃社区丰富的第三方模块和文档学习路径建议初级阶段掌握基本语法创建简单可执行文件中级阶段学习库的创建和链接理解 PUBLIC/PRIVATE/INTERFACE高级阶段掌握安装和打包编写 Find 模块使用生成器表达式专家阶段深入理解 CMake 内部机制编写复杂项目配置常用生成器表达式# 条件表达式 target_compile_definitions(mylib PRIVATE $$CONFIG:Debug:DEBUG_MODE1 $$PLATFORM_ID:Windows:WINDOWS_PLATFORM ) # 安装路径相关 $INSTALL_INTERFACE:include # 安装时的接口路径 $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include # 构建时的接口路径调试 CMake# 打印变量值 message(STATUS CMAKE_VERSION: ${CMAKE_VERSION}) message(DEBUG 调试信息) # 变量追踪 variable_watch(CMAKE_PREFIX_PATH) # 打印所有变量 get_cmake_property(vars VARIABLES) foreach(var ${vars}) message(${var} ${${var}}) endforeach()提示CMake 3.0 版本引入了现代 CMake 概念建议使用 CMake 3.10 或更高版本开始新项目并遵循基于目标的编程模式。