【C++】CMake与Makefile:核心区别与实战指南

文章目录

cmake与makefile的区别

维度CMakeMakefile
本质跨平台构建工具(生成器)编译规则脚本(依赖Make工具执行)
核心作用自动生成适配不同平台/编译器的Makefile(或VS工程、Ninja文件等)定义源码编译的依赖关系、编译命令,由Make解析执行
跨平台性天然跨平台(Windows/Linux/macOS),语法统一平台相关(如Windows需MinGW/MSYS,语法依赖Make工具版本)
语法复杂度高层抽象语法(如add_executable),易维护底层脚本语法(需手动写依赖、命令),复杂项目易臃肿
适用场景中大型/跨平台项目,适配多编译环境小型Linux/Unix项目,需精准控制编译流程
执行逻辑先执行cmake生成构建文件,再执行make编译直接执行make解析Makefile完成编译

核心总结
CMake是「构建文件生成器」,通过跨平台语法生成适配不同环境的Makefile(或其他构建文件);Makefile是「编译规则文件」,直接定义编译依赖和命令,依赖Make工具执行,仅适配类Unix环境。

CMake 常用命令详解

本文整理了CMake构建过程中最常用的核心命令,涵盖版本设置、变量定义、项目配置、编译构建、安装部署等全流程,方便快速查阅和使用。

基础配置命令

1. 指定CMake最低版本

cmake_minimum_required(VERSION 3.1.3) 
  • 作用:限定构建当前项目所需的CMake最低版本,低于该版本会直接报错,确保语法和特性兼容。
  • 示例cmake_minimum_required(VERSION 3.20)(推荐使用项目兼容的较高稳定版本)

2. 设置项目名称

project(project_name) # 扩展:指定项目语言和版本 project(project_name LANGUAGES C CXX VERSION 1.0.0) 
  • 作用:定义项目名称,同时会自动生成PROJECT_NAMEPROJECT_VERSION等预定义变量。
  • 参数说明
    • LANGUAGES:指定项目支持的编程语言(如C、CXX/C++、Fortran等);
    • VERSION:设置项目版本号。

变量操作命令

1. 普通变量定义与赋值

# 单值赋值 set(variable "content") # 多值赋值(列表形式) set(variable content1 content2 content3) # 设置C++标准(核心常用) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制要求指定的C++标准,不兼容则报错 
  • 作用:定义自定义变量或修改CMake预定义变量,支持单值/多值(列表)赋值。
  • 注意CMAKE_CXX_STANDARD用于指定编译时的C++特性标准(如11/14/17/20),需配合CMAKE_CXX_STANDARD_REQUIRED确保生效。

2. 列表操作(添加元素)

# 初始化空列表 set(variable_name "") # 向列表追加元素 list(APPEND variable_name "content1") list(APPEND variable_name "content2" "content3") 
  • 作用:管理列表类型变量,常用于收集源码文件、头文件路径等。

3. 预定义核心变量

变量名说明
CMAKE_CXX_STANDARD指定C++编译标准(如11、17)
CMAKE_CURRENT_BINARY_DIRCMake执行命令时的工作目录(编译产物输出目录)
CMAKE_CURRENT_SOURCE_DIR当前CMakeLists.txt文件所在的目录
CMAKE_INSTALL_PREFIX项目默认安装路径(默认:Unix为/usr/local,Windows为C:\Program Files

4. 字符串替换

string(REPLACE ".old" ".new" dest_variable "original_string.old") 
  • 作用:将源字符串中的指定子串替换为新子串,并将结果存入目标变量。
  • 示例:执行后dest_variable的值为original_string.new

编译构建命令

1. 添加头文件搜索路径

include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/third_party/include ) 
  • 作用:指定编译器查找头文件的目录,等价于GCC的-I参数。
  • 推荐用法:现代CMake更推荐使用target_include_directories(针对具体目标),避免全局污染。

2. 查找目录下的所有源码文件

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src src_files) 
  • 作用:递归查找指定目录下的所有源码文件(.c/.cpp),并将文件路径列表存入变量。
  • 注意:若目录下文件结构复杂,建议手动列出源码文件,避免意外引入无关文件。

3. 添加可执行目标

add_executable(app_name ${src_files} main.cpp) 
  • 作用:指定编译生成的可执行文件名称,并关联对应的源码文件。
  • 参数app_name为可执行文件名称,后续为依赖的源码文件列表。

4. 链接库文件

target_link_libraries(app_name # 系统库/第三方库 pthread # 自定义库(需先通过add_library定义) ${CMAKE_CURRENT_SOURCE_DIR}/lib/libxxx.a my_custom_lib ) 
  • 作用:为指定目标链接依赖的库文件,等价于GCC的-l参数。
  • 分类:支持静态库(.a)、动态库(.so/.dll),优先链接系统库,再链接自定义库。

流程控制命令

1. 文件存在性判断

if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/config.h) message(FATAL_ERROR "配置文件config.h不存在,请检查!") endif() 
  • 作用:判断文件/目录是否存在,配合if/endif实现条件逻辑。
  • 扩展:支持EXISTS(存在)、NOT EXISTS(不存在)、IS_DIRECTORY(是否为目录)等判断条件。

2. 循环遍历

set(numbers 1 2 3 4 5) foreach(val IN LISTS numbers) message(STATUS "当前值:${val}") endforeach() 
  • 作用:遍历列表中的每个元素,执行循环体中的命令。
  • 语法foreach(变量 IN LISTS 列表变量)foreach(变量 元素1 元素2)

3. 打印日志/错误

# 普通状态提示(编译时输出,不中断) message(STATUS "当前编译目录:${CMAKE_CURRENT_BINARY_DIR}") # 警告提示(黄色输出,不中断) message(WARNING "未指定C++标准,默认使用C++11") # 致命错误(红色输出,中断编译) message(FATAL_ERROR "缺少核心依赖库,请安装后重试!") 
  • 作用:输出构建过程中的信息,辅助调试和错误排查。

高级操作命令

1. 执行自定义命令

add_custom_command( TARGET app_name # 关联到指定目标 PRE_BUILD # 执行时机:编译目标前(可选:PRE_LINK/POST_BUILD) COMMAND echo "开始编译app_name..." # 要执行的指令 ARGS -n "编译时间:$(date)" # 指令参数 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/version.h # 依赖文件(文件更新则重新执行) COMMENT "执行预编译检查..." # 编译时打印的提示信息 ) 
  • 执行时机可选值
    • PRE_BUILD:目标编译前(仅Visual Studio支持);
    • PRE_LINK:编译完成后、链接前;
    • POST_BUILD:链接完成后(最常用)。
  • 作用:在构建流程的指定阶段执行自定义指令(如脚本、系统命令)。

2. 添加子目录(嵌套CMake)

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test EXCLUDE_FROM_ALL) 
  • 作用:指定子目录,CMake会递归处理该目录下的CMakeLists.txt
  • 参数EXCLUDE_FROM_ALL表示子目录目标不加入默认构建(需手动指定构建)。

3. 设置安装路径

# 安装可执行文件到指定目录 INSTALL(TARGETS app_name RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin # 可执行文件安装路径 LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib # 动态库安装路径(Unix) ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib # 静态库安装路径(Unix) ) # 安装头文件 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/app.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include ) 
  • 作用:指定目标文件/头文件的安装路径,执行make install时自动拷贝文件到对应目录。
  • 常用参数
    • RUNTIME:可执行文件(Windows下的.exe、Unix下的可执行程序);
    • LIBRARY:共享库(.so/.dylib);
    • ARCHIVE:静态库(.a)。

总结

以上命令覆盖了CMake从基础配置、变量操作、编译构建到安装部署的核心场景:

  • 基础配置:cmake_minimum_requiredproject 是每个CMakeLists.txt的必选开头;
  • 现代CMake推荐:优先使用target_*系列命令(如target_include_directoriestarget_link_libraries)替代全局命令,降低耦合;
  • 调试技巧:通过message(STATUS)打印变量值,排查路径、依赖等问题;
  • 安装部署:INSTALL命令配合CMAKE_INSTALL_PREFIX实现跨平台的安装路径控制。

Read more

无人机地面站QGC的安装(ubuntu20.04)

无人机地面站QGC的安装(ubuntu20.04) 1.安装依赖 使用以下命令: sudo usermod -a -G dialout $USER sudo apt-get remove modemmanager -y sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y sudo apt install libfuse2 -y sudo apt install libxcb-xinerama0 libxkbcommon-x11-0 libxcb-cursor0 -y 2.下载安装包 可以直接去官网下载,链接地址:https://docs.qgroundcontrol.com/master/en/qgc-user-guide/

By Ne0inhk
Qwen-Image-2512 V2版 - 细节拉满,更真实的AI绘画体验 ComfyUI+WebUI 一键整合包下载

Qwen-Image-2512 V2版 - 细节拉满,更真实的AI绘画体验 ComfyUI+WebUI 一键整合包下载

Qwen-Image-2512 是 Qwen-Image 文生图基础模型的 12 月更新版本,这是一个最新的文本生成图像模型,特点是 画面更真实、细节更精致,提升了人物与自然细节的真实感,适合在创意设计、教育展示、内容生产等领域使用。 今天分享的 Qwen-Image-2512 V2版 一键包基于阿里最新开源的 Qwen-Image-2512 的FP8量化版(同时支持BF16),支持消费级显卡最低12G显存流畅运行,支持更适合小白操作的WebUI模式和专业选手的ComfyUI两种模式。 相比较上个版本,V2版因使用精度更高的FP8模型,所以在生成效果上更好,同时对硬件的要求也更高,大家根据需要选择适合自己的版本。 下载地址:点此下载   模型特点 更真实的人物表现:相比旧版本,人物的面部细节、表情和环境都更自然,不再有明显的“AI感”。   更精细的自然细节:风景、动物毛发、水流等元素渲染更逼真,层次感更强。   更准确的文字渲染:在生成带文字的图像(如海报、PPT)时,排版和字体更清晰,图文融合更好。   更强的整体性能:

By Ne0inhk
j交通违法行为检测数据集 训练无人机智能交通监控、城市安防、自动驾驶辅助等场景。深度学习YOLOV11模型如何训练交通违规检测数据集 识别检测电动车头盔佩戴 行人闯红灯 横穿马路车辆闯红灯检测数据集

j交通违法行为检测数据集 训练无人机智能交通监控、城市安防、自动驾驶辅助等场景。深度学习YOLOV11模型如何训练交通违规检测数据集 识别检测电动车头盔佩戴 行人闯红灯 横穿马路车辆闯红灯检测数据集

无人机智能交通监控、城市安防、自动驾驶辅助等场景。深度学习YOLOV11模型如何训练交通违规检测数据集 识别检测电动车头盔佩戴 行人闯红灯 横穿马路车辆闯红灯检测数据集 文章目录 * 📊 数据集总体统计 * 🏷️ 类别定义与说明 * 🔢 数据集划分情况 * ✅ YOLO 训练配置文件示例(`data.yaml`) * 💡 使用建议 * 🚦 交通违规检测数据集 + YOLOv11 训练方案 * 📊 数据集概览 * 🔍 类别含义详解 * 🗂️ 推荐目录结构 * 🛠️ YOLO 配置文件:`traffic.yaml` * 🚀 YOLOv11 完整训练代码:`train.py` * 🧪 推理示例代码:`inference.py` * 🎯 应用场景建议 * ⚠️ 注意事项与优化建议 交通违规检测数据集 Yolo算法进行车辆、行人的交通违规检测任务,txt格式 7类,分别为:[‘Crossing_Violation’, ‘Crosswalk_Violation’,

By Ne0inhk
Neo4j-Desktop2.0安装教程(更改安装路径)

Neo4j-Desktop2.0安装教程(更改安装路径)

引言        由于neo4j-desktop2.0版本是不提供安装页面(默认安装在C盘),从而让你选择安装路径的,这对于C盘内存来说是灾难性的。因此,需要手动设置安装路径。 参考文献: 1. https://zhuanlan.zhihu.com/p/1935104156433121644https://zhuanlan.zhihu.com/p/1935104156433121644 2. https://blog.ZEEKLOG.net/WMXJY/article/details/150649084 安装包下载:https://neo4j.com/deployment-center/?desktop-gdbhttps://neo4j.com/deployment-center/?desktop-gdb 1文件夹创建及环境变量设置     首先需要在C盘以外的位置先创建一个Neo4j2文件夹,再在下面创建两个文件夹:App,PROData来存放软件本体和相关数据 然后打开“高级系统设置”——“环境变量”——系统变量下方的“新建”

By Ne0inhk