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