overview
其实用make作为工程管理其实是一件很难受的事情,因为现在各种的IDE都把编译链接这些东西封装起来,导致用make的人越来越少,而且学习make是一件时间成本很高的事情,以至于很多人都不愿意去学。
//test.c
#include <stdio.h>
int main(){
int distance = 100;
printf("You are %d miles away.\n", distance);
}
上面是一个test.c文件,在命令行执行make test,再执行./test你能看到如下的显示:
make test
cc test.c -o test
./test
You are 10 miles away.
很奇怪对不对,我们都没有写Makefile,为什么能编译出我们想要的。make里面内建了一些规则,它就是一个规则机器。规则说,在给定了一个target后,所以在make test中,test就是目标,make会去当前目录下寻找同名但是不同后缀名的文件,从而进行编译,但是目标test的依赖我们并没有去指明。这是远古传说中的隐含依赖,这些远古传说来自于几十年的C代码构建经验,我们不需要告诉make所有事情,make本来就知道怎么构建C文件。
我们可以去指定一个Makefile文件:
CFLAGS=-Wall -g
all: clean test
clean:
rm -rf test
执行make all显示如下:
make all
rm -rf test
cc -Wall -g test.c -o test
显然对于目标all来说,有两个依赖,一个是clean,还有一个是test。对于目标clean来说,是删除test文件,但是目标test的依赖仍然没有指定,上面已经解释过是隐含依赖。
CFLAGS是一个环境变量,可以用来设置参数,把Makefile中CFLAGS那行代码前面加个#后注释掉,然后执行CFLAGS="-Wall" make all
CFLAGS="-Wall" make all
rm -rf test
cc -Wall test.c -o test
Alipay
Wechat