1.make/Makefile
Makefile也是一个普通文件,文件中包括依赖关系和依赖方法。
依赖关系就像我们很小的时候依赖自己的父母长大是一样的,转换到文件中就是说一个可执行程序是依赖源文件的;而过程就是依赖方法,源文件通过编译形成可执行程序。
下面来看一个简单的Makefile文件:
[zwx@VM-20-3-centos mytest]$ cat Makefile
mytest:test.c
gcc test.c -o mytest
mytest: test.c是依赖关系,依赖方法就是test.c编译形成可执行程序的指令。
1.1 make指令执行
准备好Makefile,下面在test.c中写下一段简单的代码:
#include <stdio.h>
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指令默认执行的是什么呢?
1.2 .PHONY
一般来说,依赖关系中的前者是目标文件;但是如果加上了 . 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修饰之后,总是根据依赖关系,执行依赖方法。
1.3 多文件中Makefile的使用
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还是非常方便的,一次写好之后,可以连续使用。