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

CMake详细

一、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"

2. 构建
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最佳实践

1.使用 target_* 命令管理目标属性
2.避免全局变量污染
3.使用子目录管理大型项目
4.使用 CACHE 保存可配置选项
5.利用现代 CMake 提供的接口库(INTERFACE/PUBLIC/PRIVATE)
6.保持 CMakeLists.txt 简洁,每个目录只处理自己目标
7.优先使用 find_package 或 FetchContent 处理依赖
8.尽量避免硬编码路径,使用 ${CMAKE_CURRENT_SOURCE_DIR} 等变量

http://www.rkmt.cn/news/1494509.html

相关文章:

  • 别再手动加ORCID了!用LaTeX在Overleaf里一键搞定作者标识(附完整代码)
  • 郑州OPC哪个公司好
  • 保姆级教程:从Anaconda安装到策略回测,手把手带你跑通第一个掘金量化策略
  • 深度解析开源多显示器亮度管理方案:Monitorian架构设计与实战应用
  • ComfyUI-Impact-Pack终极指南:5分钟掌握AI图像增强神器
  • 2026年工程项目管理软件测评:洁净工程的关键一战
  • Point-E技术如何革新3D内容创作:从文本到点云的智能生成实战指南
  • 从‘水球’到‘地球’:CESM模式复杂度升级全流程解析(含AMIP/CMIP测试指南)
  • 别再只盯着TPM 2.0了!从国产TPCM实战出发,聊聊可信启动的静态度量链到底怎么搭
  • MCU时钟与模拟外设电气参数深度解析:从数据手册到设计实战
  • 《B3928 [GESP202312 四级] 田忌赛马》
  • 从16小时到5分钟:Illustrator批量替换革命性工具ReplaceItems.jsx完全指南
  • 深入解析MC68HC05BD7软件驱动ADC:从逐次逼近原理到嵌入式实践
  • C++入门之string(一)
  • 手把手复现中文对话机器人:LSTM Seq2Seq模型训练+推理全流程代码包
  • 如何在Windows上安装安卓应用?APK安装器的完整使用指南
  • 如何利用BiliTools的AI视频总结功能实现3倍学习效率提升
  • 瑞芯微RV1126B开发板(EASY-EAI-PI2) WIFI STA
  • 西科大数电实验四:D/ JK/ RS触发器FPGA实现与Diamond波形仿真全套工程文件
  • 如何在Photoshop中直接使用Stable Diffusion?5分钟快速上手终极AI插件指南
  • Horizon RDS场实战:从安全策略配置到应用程序池权限管理的完整避坑指南
  • 客户投诉率降低95%!往复式洗车机如何赋能洗车连锁门店转型升级? - 资讯纵览
  • 让Mac文件预览体验提升10倍的秘密武器:50+款QuickLook插件深度解析
  • 如何在3分钟内用OpenVINO AI插件让Audacity变身专业音频工作室
  • 文件系统-3-IO性能测试工具-1-fio-1-理论简介 - Hello
  • 实现 OpenClaw 跨平台联动,详细配置与实操演示
  • 猫抓cat-catch:5分钟快速上手的浏览器视频下载终极指南
  • AI 技术改变英语学习的方式
  • 模具丫姐走进箱包厂,终于懂了客户为什么先试一套模具
  • 2026年适配维普AI智能降重工具横评:亲测8款工具,把AI率稳控在安全线内