当前位置: 首页 > news >正文

CMake概述

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、linux
sudo apt install cmake # Ubuntu/Debain
2、IOS
brew install cmake # MacOS
3、windows
choco install cmake #Chocolaty
4、检查版本
cmake --version

三、基本结构
1、最小CMakeLists.txt
cmake_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.txt
cmake_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_package
find_package(Boost 1.82 REQUIRED COMPONENTS filesystem)
target_link_libraries(MyApp PRIVATE Boost::filesystem)
2.FetchContent(下载源码)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.12.1
)
FetchContent_MakeAvailable(googletest)

九、自定义命令与目标
add_custom_command(
OUTPUT generated.cpp
COMMAND python generate.py
DEPENDS 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.生成包(CPack)
include(CPack)

十一、测试集成
1.启用 CTest
enable_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 2022”

  1. 构建
    cmake --build build --config Release – -j8

十三、CMake 高级特性
1.INTERFACE 库:纯头文件库,无源码
add_library(MyHeaderLib INTERFACE)
target_include_directories(MyHeaderLib INTERFACE include/)
2.导出目标
install(TARGETS MyLib EXPORT MyLibTargets DESTINATION lib)
install(EXPORT MyLibTargets FILE MyLibTargets.cmake NAMESPACE MyLib:: DESTINATION lib/cmake)
3.工具链文件:交叉编译配置
cmake -DCMAKE_TOOLCHAIN_FILE=arm_toolchain.cmake …
4.生成器表达式
target_compile_definitions(MyApp PRIVATE “<<<CONFIG:Debug:DEBUG_BUILD>”)

十四、CMake最佳实践

http://www.jsqmd.com/news/1178230/

相关文章:

  • HTML/CSS/JS三小时极简训练:重建前端开发信心
  • 基于OpenClaw与SecGPT-14B的智能代码审计CI/CD集成实战
  • 格兰杰因果检验:时间序列中预测性依赖的统计判据
  • AIAgent可解释性设计:从黑盒到白盒的工程实践与核心方法论
  • TPA3138D2与STM32L162ZE音频系统设计与优化
  • nRF Connect for Desktop 3.9.0 离线安装指南:3步完成Power Profiler等App部署
  • 2026年7月最新青岛万国官方售后服务网点地址及客服电话一览 - 万国中国官方服务中心
  • 2026年7月杭州配电柜维修公司推荐,杭州配电柜维修,杭州配电柜维修厂家选哪家 - 品牌推荐师
  • 被裁半月Java七面进阿里真实面经分享!
  • Win10家庭版重装系统完整指南:从U盘启动到系统优化
  • Claude Code与cc-switch本地部署:第三方API接入与代码生成实践
  • ESXi 7.0/8.0 虚拟机网络配置:4种适配器模式详解与吞吐量测试
  • 2026 企业为什么必须做智能体?从“上不上“到“怎么落“
  • Ubuntu安装桌面,mac电脑远程桌面
  • 刷酸人群面膜哪家好用:蜜妙诗舒缓维稳 - MXyuyu
  • AI Agent工程师实战指南:从RAG到LangGraph的技术架构解析
  • 生产级多维聚合:pandas中可交付的多指标分析实战
  • 【数据之道解惑001】数据体系为什么建不起来——Ownership应始终作为数据治理的目标,坚持长期推进
  • 2026最新昭通本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水
  • Pydantic AI构建生产级LLM流式响应系统
  • AI 芯片全景对比:NVIDIA / AMD / 华为,谁在为你的模型“发电“?
  • 《月华剑士》限定品抢购实战:从信息监控到自动化脚本全攻略
  • 20个CC0素材网站2024年可用性实测:Pexels、Coverr等5个无需梯子访问
  • Java基础实操手记:27个可运行示例+错误对照学习
  • Vivado 2018.3 安装避坑指南:3个常见报错分析与Windows/Linux双系统配置
  • 多维聚合实战:从pandas groupby到银行级生产分析流水线
  • STM32F427ZI与AD5593R的嵌入式信号处理方案
  • C语言模拟STL容器:从内存管理到红黑树实现
  • 2026最新无锡本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水
  • 模电面试问题汇总三