一起来写Makefile

共 1585字,需浏览 4分钟

 ·

2021-09-01 23:37

前言:在Linux 系统下编写 C/C++ 程序,学习 Makefile 的基础是非常有必要的,至少需要看懂程序的编译链接过程,才能对项目有个整体的认识。当然最好是自己能写 Makefile,本文介绍了 Makefile 的一些基本规则。

Makefile 的规则

首先需要了解 Makefile 文件的基本规则,如下:
61d057e3327009e940ad92926afec4bd.webp
按照上面的规则来写一个程序编译的 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 二进制文件。目录结构如下:
fff5c23edeadff89699fc729d719d674.webp
根据规则编写一个简单的编译脚本:

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 编译效果如下:
13864e8c465face12b143d3279a07eeb.webp

使用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)
浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报