Makefile基础学习

我们在Linux中写一个工程,使用Makefile来进行工程文件的管理是必不可少的,那么这篇文章就主要来讲一下Makefile的一些基本写法。
我们以一个简单的工程为例:
在这里插入图片描述
这是一个简单的计算器的小工程,我们可以看到有跟多 .c.h 文件,如果我们直接gcc进行编译的话会比较麻烦,这时候我们就需要Makefile来进行管理。

一、Makefile基本写法规则

首先我们要弄明白Makefile的作用是什么?

第一是将写好的程序进行编译、链接生成可执行文件;
第二是将各类型的文件进行管理。

所以我们第一步就是要将程序进行编译链接,但在这之前我们需要清除Makefile的写法规则:

目标 : 依赖的文件
	命令

这就是Makefile的基本的写法,其中有几条规则:

1、依赖的文件可以没有,命令也可以没有;
2、命令前面的空必须是用tab键敲的,不能使用空格键。
3、'#'后面写注释

在了解了写法之后,就要按照这个写法来进行各个文件的编译和链接,我们将最终的可执行文件命名为main
在这里插入图片描述
我们可以看到,绿色的就是目标,黑色的就是依赖的文件,红色的就是命令,main 这个可执行文件所依赖的是所有 .c 文件编译后的 .o 文件,而每个 .o 文件又依赖于 .c 文件,从这我们也可以看出Makefile执行的时候是一个递归进行的。
我们可以 make 一下看看:
在这里插入图片描述
我们可以看到很明显是一个递归的过程。
当我们再make的时候我们会发现会报一个:

make: `main' is up to data.

这个意思就是Makefile自动识别我们是否将源文件进行修改,如果未修改则不会重复执行。
我们这样执行会生成许多的 .o 文件,我们可以在最后加上:

clean : 
	rm -rf *.o

这样执行结束后会自动将所有的 .o 文件删掉,但是这就带来了一个问题,那就是如果这个目录下本来就有一个名字叫 clean 的文件,那么Makefile就不会执行了,如何解决这个问题呢?很简单,在最前面加上:

.PHONT: clean

就可以了,这样无论是否有重的都会执行,也可以在后面加上 main ,让Makefile总是执行。

二、Makefile变量及函数

当然以上并不是我们最终写法,我们可以发现如果按照这样写会很麻烦,所以Makefile为我们提供了类似编程语言的变量、函数以及相应的简化字符等非常方便的操作

(一)简化字符

Makefile提供了一下几个简化字符:

1、$@ :表示目标
2、$^ :表示所有依赖的文件
3、$< :表示第一个依赖的文件
4、% :通配符,表示所有的.c .o文件,也可以写作“$*”

在这里插入图片描述

(二)变量

为了更方便一些,Makefile给我们提供了同编程语言一样的变量;
比如我们现在使用的是 gcc 可能之后会变成 g++ 或是别的编译器,那么久可以用变量来代替;
还有我们在写的时候需要照抄一大堆的文件名,我们也可以定义一个变量来简化。

变量的写法规则:

变量名=变量

使用规则:

$(变量名)

在这里插入图片描述

(三)函数

经过上面的变换,我们已经得到了很简便的形式了,但是所有的文件名还需要我们手打,不仅麻烦而且可能会出错,这是Makefile又为我们提供了函数。

函数的使用规则:

$(函数名  参数) (可以有多个参数,中间用逗号隔开)

在这里插入图片描述
这里需要注意一个问题,在第二个红色框内“$(SRCS:.c=.o)”这句中,冒号和逗号中间一定不能有空格,否则的话路径就会有问题!

三、文件管理

(一)将所有的.o文件放到obj目录中

我们实际上在进行Makefile管理的时候是肯定不能将所有的.o文件删掉的,又不能和其他文件放在一起,那样会显得比较乱,所以我们可以将所有的.o文件统一放到obj目录下。

主要的步骤有四步:

1、获取当前目录路径
2、在当前路径下获取到obj目录
3、创建
4、将所有.o文件放到obj目录下

在这里插入图片描述
通过这四部走,我们就可以将.o文件进行管理。

(二)所有文件管理

当然了,在实际开发中,我们最终要得到的是这样一个结果:
在这里插入图片描述
即所有的 .h 文件放到 include 中,所有的 .c 文件放到 src 中,所有的 .o 文件放到 obj 中,最后一个Makefile文件在外面,这样才是一个好的文件管理。

最终我们呈现的是:
在这里插入图片描述

(三)补充

最后我们来看一下我们最终版的Makefile。

其中有一些小的技巧

1、notdir这个函数的意思是:只取完整路径的文件名
2、-I $(BASEDIR)/include这是包含了头文件的位置
3、all 这是为了在有多个项目的时候可以按顺序进行生成可执行文件
4、最后的rebuild是重新编译

四、小结

以上就是一个Makefile的基础的写法,Makefile很好的帮助我们进行了工程文件的管理,是一个非常好用的软件,而想写好也是需要费一番功夫的,需要多写多练。本人也是一名Linux初学者,有什么问题欢迎大家留言指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值