Linux项目自动化构建工具-make/Makefile

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还是非常方便的,一次写好之后,可以连续使用。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

new出新对象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值