makefile探讨

欠了两个月,,继续补锅ing……
学校的网时好时坏,连github都上不去了,只能回来补文了。

makefile是什么呢?在linux中大家应该是常用的,比如make,clean等等,都是它。按照我的理解,他就像windows下的bat文件一样,是一连串命令的总和。就像在windows下,我们把doc命令整合起来放到一个.bat文件中,当需要执行这一串命令时只允许.bat文件即可。makefile一样的。我们将大量冗长的linux命令放到makefile中,当需要执行这些命令,我们不用繁琐地去敲那一个个命令,而是直接执行makefile,或者是make,或者是clean(看你怎么写你的makefile了)。

上一篇咱们说到gcc的参数有-e(预处理)、-s(编译)、-c(汇编)、-o(连接)这些,这就是编译原理里面说的那些东西。咱们现在拿-c(汇编)和-o(连接)举个例子。

makefile由浅入深,从直观冗长到简洁抽象有五个写法。咱们一一展开介绍:

假设已经有了一个hello.c的文件和myFun.c文件以及对应的myFun.h文件,让hello.c调用myFun.c(要是只有一个hello.c直接gcc hello.c -o hello就行了,根本看不出makefile的牛逼来)。

version 1 初级自动编译

main:    hello.o myFun.o
         gcc hello.o myFun.o -o hello
hello.o: hello.c myFun.h
         gcc -c hello.c -o hello.o
myFun.o: myFun.c myFun.h
         gcc -c myFun.c -o myFun.o
clean:   
         rm -f *.o

这写的是个啥意思呢?
首先从main开始,要用到hello.o和myFun.o。好吧,现在没有这个,咋办?下面有。hello.o: hello.c myFun.h是说hello.o的生成(或者可以理解为这个的执行)需要有hello.c和myFun.c文件。那它是怎么执行的呢?gcc -c hello.c -o hello.o即将hello.c文件汇编成hello.o文件了。下一行的myFun.o是一样的道理。现在就有了hello.o和myFun.o文件了。顺理成章地继续将hello.o和myFun.o连接成可执行文件hello。最后是clean清除掉汇编过程中生成的.o文件。
虽然说起来麻烦了点,但还是蛮好理解的。
那么继续。

version 2 用变量进行替换

OBJ = hello.o myFun.o
CC = gcc
CFLAGS = -c

main:    $(OBJ)
         $(CC) $(OBJ) -o hello
hello.o: hello.c myFun.h
         $(CC) $(CFLAGS) hello.c -o hello.o
myFun.o: myFun.c myFun.h
         $(CC) $(CFLAGS) myFun.c -o myFun.o
clean:   
         rm -f *.o

其实也没啥,就是把hello.o和myFun.o替换成了OBJ,把编译器gcc替换成了CC,把参数-c替换成了CFLAGS,变量替换罢了。

version 3 自动变量

OBJ = hello.o myFun.o
CC = gcc
CFLAGS = -c

main:    $(OBJ)
         $(CC) $^ -o $@
hello.o: hello.c myFun.h
         $(CC) $(CFLAGS) $< -o $@
myFun.o: myFun.c myFun.h
         $(CC) $(CFLAGS) $< -o $@
clean:   
         rm -f *.o

这样一看,挺花哨的,多了好多莫名其妙的符号。其实一说这些符号的含义才发现根本没啥,也还是变量替换:
$^是所有的依赖文件,它会自己用空格分开,但不会重复包含;
$@是目标的完整名称。
跟上面那个一模一样吧?再继续。

version 4 隐式规则

OBJ = hello.o myFun.o
CC = gcc
CFLAGS = -c

main:    $(OBJ)
         $(CC) $^ -o $@
clean:   
         rm -f *.o

我去,直接少了两大段啊。这是makefile的一个优化,它里面已经写好了许多诸如
$(CC) $(CFLAGS) $< -o $@之类的东西。但是有得必有失,有些时候“隐式规则”也会造成些问题(反正我个人不太喜欢这种风格的东西)。

version 5 模式规则

OBJ = hello.o myFun.o
CC = gcc
CFLAGS = -c

main:    $(OBJ)
         $(CC) $^ -o $@
%.o: %.c
         $(CC) $(CFLAGS) $< -o $@
clean:   
         rm -f *.o

比第四种隐式规则多了一段,多着的这一段就是将第三种自动变量的相似模式整理了出来归并到了一起。我最喜欢这样的写法了,又简单,又不像第四种那样给人感觉不可控。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值