当前位置: 首页 > 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.dtcms.com/a/304963.html

相关文章:

  • 基于 xlsx-js-style 的 Excel 导出工具实现导出excel
  • JSON解析(day20)
  • 飞机大战小游戏
  • string
  • 如何进行项目复盘?核心要点分析
  • 从线下到线上:解析足浴按摩平台如何实现成本降低80%的技术方案
  • java基础面试题(5)
  • 高精度惯性导航IMU传感器价格供应商
  • 数据处理和统计分析——04 Pandas DataFrame
  • Python的‌魔法方法‌
  • Java学习第八十七部分——四次挥手
  • Java设计模式之《备忘录模式》
  • 80V降5V,输出电流4A,应用于车载充电器
  • 工厂方法模式 Factory Method Pattern
  • 监控场景视频质量异常修复:陌讯动态增强算法实战解析
  • 深入浅出设计模式——创建型模式之建造者模式 Builder
  • LangChain API 功能介绍和使用示例
  • 单卡10分钟部署MiniCPM4-0.5B:轻量级大模型本地运行指南
  • ESP8266 AT 固件
  • Linux信号量:进程同步与互斥的核心机制
  • 人形机器人指南(十四)集成
  • 248°视野里的温柔革命:当清洁成为治愈城市的艺术
  • Qt 移动应用界面设计原则
  • 智能Agent场景实战指南 Day 23 : Agent安全与隐私保护
  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 【LeetCode 热题 100】(二)双指针
  • 基于Java+SQLServer2017实现(Web)酒店客房管理系统
  • MongoDB系列教程-教程概述
  • 系统选择菜单(ubuntu grub)介绍
  • 标量子查询 外表有多少重复值决定filter次数 转化 left join