一起来写Makefile
测试427
共 1585字,需浏览 4分钟
· 2021-09-01
前言:在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)
评论
每天都有1款AI产品拆解!和1300名产品经理一起成长的打卡社群
我相信每个在职的产品经理,都巴不得别人给自己介绍一款没用过的同行产品,方便去提升产品设计的产品感。就算是从事产品10年的产品经理,也需要致力于竞品的体验和挖掘,他们都会在工作中,体验新的产品。养成体验产...
Kevin改变世界的点滴
0
想徒手写个文件系统?来一起呀
本文来自我的大规模数据系统专栏《系统日知录》,专注存储、数据库、分布式系统、AI Infra 和计算机基础知识。欢迎订阅支持,解锁更多文章。你的支持,是我前行的最大动力。 主要“编译”自书籍《Operating Systems: T...
木鸟杂记
0
我期待着与你再次相遇,与你一起漫步,一起欣赏烟花的绚烂!
在一个宁静的午后,我站在窗边,眼前的景色让我陷入了深深的沉思。远处的苍山依旧屹立,高耸入云,它的形状各异,有的山峰如同被刀削斧砍般峻峭而雄伟,有的则平缓绵延,宛如大地的脊梁。随着时间的推移,山上的树木...
全栈架构社区
0
当孩子说“妈妈,没人跟我一起玩”,记得第一时间做这件事
hi,我是大J, 点击?关注我 当孩子跟你求助:“妈妈,我没有朋友,谁都不想跟我玩;妈妈,学校好没有意思”的时候,我们应该怎么办?” 咱们当爸妈的第一反应是什么?心疼又焦虑,对不对? 但我要提醒大家,要解决问题,...
゛若久
0
“上班”没出路?——读完本文,一起开启2024年吧!(文末有赠品)
关注上方蓝字关注我们 ”愿你生命中有够多云翳,来造成一个美丽的黄昏”。 每一年的开始或者结尾,我们都会思考总结:如何让每一年更加有意义,更加值得回味。 本文3.3 K 字, 文末赠送 价值 96元书籍(包邮) 01 上班...
唧唧歪歪PM
0
千帆杯首期赛题公布!一起探索 AI 原生应用的时间魔法
不知从什么时候起,各大主题乐园不再只是为孩子打造的童话世界,也俨然成为了成年人的理想国。无数的成年人换上霍格沃茨制服,挑选自己的魔杖,逃离“麻瓜世界”,前往环球影城;许多成年的迪士尼粉丝也蜂拥至上海迪士...
SegmentFault
0