一起来写Makefile
前言:在Linux 系统下编写 C/C++ 程序,学习 Makefile 的基础是非常有必要的,至少需要看懂程序的编译链接过程,才能对项目有个整体的认识。当然最好是自己能写 Makefile,本文介绍了 Makefile 的一些基本规则。
Makefile 的规则
首先需要了解 Makefile 文件的基本规则,如下:
按照上面的规则来写一个程序编译的 Makefile 脚本,如下:
# 井号是注释
hello:hello.o
gcc hello.o -o hello # 链接
hello.o:hello.S
gcc -c hello.S -o hello.o # 编译
hello.S:hello.i
gcc -S hello.i -o hello.S # 汇编
hello.i:hello.c
gcc -E hello.c -o hello.i # 预编译
.PHONY: # 伪目标
clean:
rm hello hello.i hello.S hello.o
示例一
接下来编写一个测试程序 test 的 Makefile 文件,编译后需要生成一个 test 二进制文件。目录结构如下:
根据规则编写一个简单的编译脚本:
test:main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o test
main.o:main.c
gcc -c main.c -o main.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
div.o:div.c
gcc -c div.c -o div.o
.PHONY:
clean:
rm *.o
cleanall:
rm *.o test
执行 make 编译效果如下:
使用Makefile变量
Makefile 定义变量的几种符号含义: = 替换; += 追加; := 常量
使用变量后的 Makefile 示例一文件:
CC :=gcc
TAR=test
OBJ=main.o add.o sub.o mul.o div.o
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
main.o:main.c
$(CC) -c main.c -o main.o
add.o:add.c
$(CC) -c add.c -o add.o
sub.o:sub.c
$(CC) -c sub.c -o sub.o
mul.o:mul.c
$(CC) -c mul.c -o mul.o
div.o:div.c
$(CC) -c div.c -o div.o
.PHONY:
clean:
rm $(OBJ)
cleanall:
rm $(OBJ) $(TAR)
Makefile 隐含规则
%.c 和 %.o :任意的 .c 文件和 .o 文件
*.c 和 *.o :所有的 .c 文件和 .o 文件
Makefile 通配符
Makefile 中常见的自动变量
命令 | 含义 |
---|---|
$< | 第一个依赖文件的名称 |
$^ | 所有的依赖文件 |
$@ | 所有的目标文件 |
利用通配符改进的示例一
CC :=gcc
TAR=test
OBJ=main.o add.o sub.o mul.o div.o
$(TAR):$(OBJ)
gcc $^ -o $@
%.o:%.c
$(CC) -c $^ -o $@
.PHONY:
clean:
rm $(OBJ)
cleanall:
rm $(OBJ) $(TAR)
评论