热门标签 | 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`命令也能正常工作。

希望本文对您有所帮助,欢迎批评指正。
推荐阅读
  • Eclipse 中 Maven 的基础配置指南
    本文详细介绍了如何在 Eclipse 环境中配置 Maven,包括环境变量的设置、Maven 插件的安装与配置等关键步骤,旨在帮助开发者顺利搭建开发环境。 ... [详细]
  • 本文详细介绍了Android开发中的关键组件——View和ViewGroup类,以及Android平台上的两种主要事件处理方式。同时,文章还探讨了如何利用Android提供的标准布局文件来优化UI设计。 ... [详细]
  • 本文详细介绍了如何从SVN中获取项目,并在本地环境中进行有效的构建和开发,包括具体的步骤和配置方法。 ... [详细]
  • 本文详细介绍如何在iOS项目中集成和使用KTVHTTPCache音视频缓存插件,包括Podfile配置、初始化设置及实际应用中的使用方法。 ... [详细]
  • 深入理解JVM内存加载机制与实践
    本文通过一个简单的Java类`Person`的示例,详细解析了JVM在加载和运行时如何处理类和对象的内存分配过程。通过具体代码演示,帮助读者更好地理解和掌握JVM内存管理的核心概念。 ... [详细]
  • 在尝试重新激活已过期的 Visual Studio 2008 试用版时遇到了困难,特别是找不到输入序列号的位置。经过一番探索,最终找到了有效的解决方法,包括未安装和已安装过期后的处理方式。 ... [详细]
  • Java面向对象编程深入解析
    本文详细探讨了Java中的关键字static、单例模式、main()方法、代码块、final关键字、抽象类与方法、模板方法设计模式、接口、内部类等内容,旨在帮助读者深入理解和掌握Java面向对象编程的核心概念。 ... [详细]
  • 解决Ant编译时出现的非法字符错误
    在进行Java项目的Ant构建过程中,有时会遇到由平台差异引发的编译错误。本文将详细探讨一种常见的错误——'error: illegal character'及其解决方案。 ... [详细]
  • ECharts 基础使用指南
    本文档提供了一个简单的 ECharts 使用示例,帮助初学者快速了解如何在网页中集成和使用 ECharts 创建图表。更多详细信息请参阅官方文档:https://www.echartsjs.com/zh/tutorial.html#5%20分钟上手%20ECharts ... [详细]
  • 本文详细探讨了函数与对象方法的主要区别,包括它们的定义方式、调用规则以及在面向对象编程语言中的应用特点。 ... [详细]
  • NFC OMA 接口访问优化
    本文探讨了NFC设备中OMA接口的访问方式,特别是针对IC制造商提供的NFC swp-sim访问与NFC服务提供商对eSe(嵌入式安全元件)访问的不同处理方法。文中提出了几种解决方案以解决由此产生的双SmartcardService运行问题。 ... [详细]
  • 深入探讨PHP中的输出缓冲技术(Output Buffering)
    本文深入解析了PHP中输出缓冲(Output Buffering)的原理及其在Web开发中的应用,特别是如何通过输出缓冲技术有效管理HTTP头部信息,提高代码的灵活性与健壮性。 ... [详细]
  • 原作者:小甲鱼(注:最左边是文件头的偏移量。)IMAGE_DOS_HEADERSTRUCT{+0hWORDe_magicMagi ... [详细]
  • C# 对象转 JSON 字符串的方法与应用
    本文介绍如何在 C# 中使用一般处理程序(ASHX)将对象转换为 JSON 字符串,并通过设置响应类型为 application/json 来确保客户端能够正确解析返回的数据。同时,文章还提供了 HTML 页面中不依赖 jQuery 的 AJAX 方法来接收和处理这些 JSON 数据的具体实现。 ... [详细]
  • 利用Java与Tesseract-OCR实现数字识别
    本文深入探讨了如何利用Java语言结合Tesseract-OCR技术来实现图像中的数字识别功能,旨在为开发者提供详细的指导和实践案例。 ... [详细]
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社区 版权所有