热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

单目录多文件Makefile编写指南

本文将探讨如何在一个目录下针对多个源文件编写高效的Makefile,通过实例介绍从基础到高级的Makefile编写技巧。
在软件开发过程中,Makefile是自动化构建过程不可或缺的一部分。尽管我之前对Makefile有所了解,但并没有深入研究或全面掌握其编写方法。为了巩固和分享我的知识,本文将详细介绍在单个目录中管理多个文件的Makefile编写技巧。

假设当前目录包含以下文件:`fun.h`, `fun.c`, `main.c`, `Makefile`。所有`.c`文件都依赖于相应的`.h`文件。

### 常规编译步骤
1. **预处理**:`gcc -E -o fun.i fun.c`
2. **编译**:`gcc -S -o fun.s fun.i`
3. **汇编**:`gcc -c -o fun.o fun.s`
4. **链接**:`gcc -o main fun.o main.o`

以上是使用GCC进行编译的基本步骤,接下来我们将这些步骤整合进一个Makefile中。

#### 第一版Makefile
```cpp
CC = gcc
CFLAGS = -g -Wall
objects = main.o fun.o

main: main.o fun.o
$(CC) -o main main.o fun.o

main.o: main.c
$(CC) $(CFLAGS) -c main.c -o main.o

fun.o: fun.c
$(CC) $(CFLAGS) -c fun.c -o fun.o

clean:
rm -rf $(objects) main
```
此版本的Makefile直接基于GCC命令行指令编写。

#### 利用自动推导特性简化Makefile
Makefile具有自动推导功能,例如,当目标文件为`fun.o`时,它能自动识别`fun.c`作为依赖文件,并应用默认的编译规则。因此,我们可以通过指定依赖的头文件来进一步简化Makefile。

```cpp
CC = gcc
CFLAGS = -g -Wall
objects = main.o fun.o

main: $(objects)
$(CC) -o main $(objects)

main.o: fun.h

fun.o: fun.h

clean:
rm -rf $(objects) main
```

#### 进一步简化
为了使Makefile更加简洁,可以考虑如下版本:

```cpp
CC = gcc
CFLAGS = -g -Wall
objects = main.o fun.o

main: $(objects)

# $(objects): fun.h // 可选

.PHONY: clean
clean:
rm -rf $(objects) main
```

这里使用了`.PHONY`伪目标来声明`clean`不是文件名,这样即使存在名为`clean`的文件,`make clean`命令也能正常工作。

希望本文对您有所帮助,欢迎批评指正。
推荐阅读
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
author-avatar
小小小菜鸡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有