作者:小小小菜鸡 | 来源:互联网 | 2024-12-07 15:59
在软件开发过程中,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`命令也能正常工作。
希望本文对您有所帮助,欢迎批评指正。