Makefile也是一个普通文件,文件中包括依赖关系和依赖方法。
依赖关系就像我们很小的时候依赖自己的父母长大是一样的,转换到文件中就是说一个可执行程序是依赖源文件的;而过程就是依赖方法,源文件通过编译形成可执行程序。
下面来看一个简单的Makefile文件:
- [zwx@VM-20-3-centos mytest]$ cat Makefile
- mytest:test.c
- gcc test.c -o mytest

mytest: test.c是依赖关系,依赖方法就是test.c编译形成可执行程序的指令。
准备好Makefile,下面在test.c中写下一段简单的代码:
- #include
-
- int main()
- {
- printf("Hello Makefile\n");
- return 0;
- }
使用make指令:
- [zwx@VM-20-3-centos mytest]$ make
- gcc test.c -o mytest
使用make指令之后默认执行了mytest: test.c的依赖方法,那如果Makefile文件中,有其他的依赖关系和依赖方法,make指令默认执行的是什么呢?

一般来说,依赖关系中的前者是目标文件;但是如果加上了 . PHONY,前者就是一个伪目标,而伪目标总是被执行的。
介绍.PHONY之前先来介绍一下stat指令:查看文件的Acess(最近访问时间)、Modify(最近修改时间-文件内容)、Change(最近修改时间-文件属性)。
- [zwx@VM-20-3-centos mytest]$ stat test.c
- File: ‘test.c’
- Size: 81 Blocks: 8 IO Block: 4096 regular file
- Device: fd01h/64769d Inode: 1444487 Links: 1
- Access: (0764/-rwxrw-r--) Uid: ( 1002/ zwx) Gid: ( 1002/ zwx)
- Access: 2022-11-11 18:55:28.149902027 +0800
- Modify: 2022-11-11 18:55:26.179928784 +0800
- Change: 2022-11-11 18:55:50.895593084 +0800
这里就有很多人会问了,这三个时间在这里有什么用呢?

当使用make指令编译源文件的时候,如果文件已经编译,并且源文件没有修改,那么无法执行编译的指令;
关于源文件和可执行程序的顺序,一定是首先出现源文件,然后通过源文件编译链接形成可执行程序,所以如果test.c的Modify时间比mytest要晚的话,说明test.c不是最新的,可以编译链接;否则就无法继续再编译链接。
怎么理解伪目标总是被执行的?
clean被.PHONY修饰之后,总是根据依赖关系,执行依赖方法。

Makefile在多文件中使用起来就更简单了,像我们前面写的依赖方法只是一条指令,如果有很多指令的话,使用起来更简单。

只要同时编译main.c和test.c就能生成可执行程序:
- [zwx@VM-20-3-centos mytest]$ gcc test.c main.c -o mytest
- [zwx@VM-20-3-centos mytest]$ ll
- total 28
- -rw-rw-r-- 1 zwx zwx 45 Nov 11 19:14 main.c
- -rw-rw-r-- 1 zwx zwx 71 Nov 11 18:58 Makefile
- -rwxrwxr-x 1 zwx zwx 8416 Nov 11 19:14 mytest
- -rw-rw-r-- 1 zwx zwx 63 Nov 11 19:11 test.c
- -rw-rw-r-- 1 zwx zwx 46 Nov 11 19:14 test.h
- [zwx@VM-20-3-centos mytest]$ ./mytest
- hello show
那如果我们想要使用Makefile来完成呢,应该怎样去写:
- [zwx@VM-20-3-centos mytest]$ cat Makefile
- mytest:test.o main.o
- gcc test.o main.o -o mytest
- test.o:test.c
- gcc -c test.c -o test.o
- main.o:main.c
- gcc -c main.c -o main.o
- .PHONY:clean
- clean:
- rm -f *.o mytest

- [zwx@VM-20-3-centos mytest]$ make
- gcc -c test.c -o test.o
- gcc -c main.c -o main.o
- gcc test.o main.o -o mytest
- [zwx@VM-20-3-centos mytest]$ ll
- total 36
- -rw-rw-r-- 1 zwx zwx 45 Nov 11 19:14 main.c
- -rw-rw-r-- 1 zwx zwx 1360 Nov 11 19:20 main.o
- -rw-rw-r-- 1 zwx zwx 166 Nov 11 19:20 Makefile
- -rwxrwxr-x 1 zwx zwx 8416 Nov 11 19:20 mytest
- -rw-rw-r-- 1 zwx zwx 63 Nov 11 19:11 test.c
- -rw-rw-r-- 1 zwx zwx 46 Nov 11 19:14 test.h
- -rw-rw-r-- 1 zwx zwx 1496 Nov 11 19:20 test.o
- [zwx@VM-20-3-centos mytest]$ ./mytest
- hello show
多文件中使用Makefile还是非常方便的,一次写好之后,可以连续使用。