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

Makefile 与 CMake 关系指南

Makefile 与 CMake 关系指南

一句话理解核心关系

CMake 生成 Makefile,Makefile 指导编译

输入
输出
输入
输出
CMakeLists.txt
CMake工具
Makefile
make命令
可执行文件

核心概念对比

特性MakefileCMake
角色构建执行者构建生成器
文件MakefilemakefileCMakeLists.txt
编写内容具体编译命令项目描述
跨平台性弱(需手动适配不同系统)强(自动生成平台相关文件)
使用方式直接运行 make先运行 cmake 再运行 make
学习难度中等(需懂编译过程)较低(声明式配置)
适用规模小型项目中大型项目

工作流程对比

Makefile 直接构建

1. 编写 Makefile
2. 运行 make
3. 生成可执行文件

CMake + Makefile 构建

1. 编写 CMakeLists.txt
2. 运行 cmake(生成 Makefile)
3. 运行 make(读取 Makefile)
4. 生成可执行文件

如何选择?

推荐使用 Makefile 当:

  • 项目只运行在 Linux/macOS
  • 项目文件少于 10 个
  • 需要快速编写构建脚本
  • 示例:
    # 最小Makefile示例
    hello:gcc hello.c -o hello
    

推荐使用 CMake 当:

  • 需要支持 Windows/Linux/macOS
  • 项目包含多个子目录
  • 需要依赖第三方库
  • 示例:
    # 最小CMake示例
    cmake_minimum_required(VERSION 3.10)
    project(Hello)
    add_executable(hello hello.c)
    

典型使用场景

Makefile 最佳场景

# 简单C程序构建
CC = gcc
TARGET = app
SRC = main.c utils.c$(TARGET): $(SRC)$(CC) $^ -o $@

CMake 最佳场景

# 跨平台项目配置
cmake_minimum_required(VERSION 3.10)
project(MyApp)# 添加子目录
add_subdirectory(src)
add_subdirectory(libs)# 包含头文件
include_directories(include)# 添加可执行文件
add_executable(app main.cpp)# 链接库
target_link_libraries(app PRIVATE mylib)

实际项目中的协作

现代项目常用组合方式:

项目目录/
├── CMakeLists.txt    # CMake配置文件
├── src/              # 源代码
├── include/          # 头文件
└── build/            # 构建目录(自动生成)├── Makefile      # CMake生成的└── app           # 生成的可执行文件

构建命令序列:

# 创建构建目录
mkdir build
cd build# 生成Makefile
cmake ..# 编译程序
make# 运行程序
./app

关键差异总结

方面MakefileCMake
依赖管理手动指定头文件依赖自动扫描文件依赖
编译器切换需修改Makefile单命令切换:cmake -DCMAKE_CXX_COMPILER=clang++
IDE支持有限完美支持VS/Xcode/CLion等
安装规则需手动编写install目标内置install命令
测试支持需自行集成内置CTest框架

新项目选择建议

  1. 学习目的 → 从 Makefile 开始
  2. 跨平台需求 → 直接使用 CMake
  3. 开源项目 → 优先选择 CMake
  4. 嵌入式开发 → CMake(简化交叉编译)
  5. 快速原型 → Makefile

📌 黄金法则:当不确定时,选择 CMake。它虽然需要额外学习,但长期收益更高,特别是当项目规模增长或需要跨平台时。

总结

  • Makefile 是厨师:直接烹饪菜肴(编译程序)
  • CMake 是食谱作者:编写通用菜谱(生成Makefile)
  • 现代C/C++项目:
    • 小型/学习 → 只用 Makefile
    • 正式/跨平台 → CMake + Makefile组合

两者协同工作,构成高效的构建系统。初学者建议从Makefile入手理解编译过程,再学习CMake提高效率。

http://www.lryc.cn/news/603555.html

相关文章:

  • Java设计模式之《备忘录模式》
  • 怎么理解使用MQ解决分布式事务 -- 以kafka为例
  • 【EDA】Calma--早期版图绘制工具商
  • Kafka运维实战 16 - kafka 分区重新分配【实战】
  • Javaweb————揭秘404 not found(HTTP常用响应码)
  • 【数据结构】真题 2016
  • STM32--DHT11(标准库)驱动开发
  • JVM 崩溃(Fatal Error)解决方法
  • 26考研11408数据结构
  • 【Docker】 Docker镜像瘦身终极指南:多阶段构建+Alpine优化+分层策略深度解析
  • 飞机大战小游戏
  • 第十六章 Java基础-拼图小游戏
  • 【Unity编辑器扩展】Unity 笔记编辑器开发详解(支持多页面、重命名、持久化保存)
  • 项目历程—生命数组游戏(两版本)
  • Unity 编辑器开发 之 Excel导表工具
  • 游戏盾从哪些方面保护网站业务?
  • c语言-数据结构-二叉树OJ之子树与二叉树的构建
  • QT项目 -仿QQ音乐的音乐播放器(第三节)
  • 电脑没有声音了怎么恢复 快速解决音频故障
  • 预装Windows 11系统的新电脑怎么跳过联网验机
  • Wndows Docker Desktop-Unexpected WSL error
  • Docker初学者需要了解的几个知识点(三)
  • docker 重新安裝
  • 小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。
  • 数据结构 排序(2)---选择排序
  • RK3568下的进程间广播通信:用C语言构建简单的中心服务器
  • 【WRF工具】服务器中安装编译GrADS
  • 信创国产Linux操作系统汇总:从桌面到服务器,百花齐放
  • 聚铭安全管家平台2.0实战解码 | 安服篇(三):配置保障 自动核查
  • mapbox进阶,mapbox-gl-draw绘图插件扩展,编辑模式支持点、线、面的捕捉