简单的Makefile

一.首先来简单的介绍一下什么是makefile

makefile简单来说就是管理我们的源文件的,方便我们去编译。举个例子

假如我们写了一个项目里面有add.c mul.c sub.c div.c test.c head.h的话,假如要自己去编译这个文件的话,我们需要这样写gcc test.c sub.c div.c mul.c sub.c  -o app(注意:因为头文件和.c文件在一个文件夹里面,所以在编译的时候系统会自己在当前文件夹里面寻找头文件即head.h,所以不需要我们注明出来,如果头文件不在当前的文件夹得话,则需要我们在gcc 中加入-I +头文件目录,这里的I是大写的)


如果我的项目有n个这样的.c文件难道我编译的时候需要gcc +......写一堆东西吗?假如这写.c文件如果不在一个目录下面的话岂不是更加的麻烦,这个时候使用makefile就可以帮我们自动化管理我们的编译,只需要make一下就可以自动编译,而且可以控制谁先编译谁后编译和哪些文件需要重新编译等一系列强大的功能,不过此篇博客只是简单的讲解一下makefile(注意:makefile的是一个文件名,他的命名方式只有makefile和Makefile)

1.下面就来制作我们第一个最简单版本的makefile

1.首先在当前文件夹创建一个makefile文件

vim makefile
2.编写的规则就是:生成目标:依赖文件

                                      (缩进)  命令(使用依赖文件生成目标的命令),这里的缩进是Tab健,如果你回车以后没有自动生成缩进,就使用Tab缩进,不能用空格,如果生成了就不用管了

这是一个最挫的版本的makefile,然后wq保存退出,这样的话我们直接输入命令make就可以生成app了

因为当我们make的时候,就会makefile文件里面首先会要生成目标文件,然后找到目标文件的依赖文件然后执行生成命令。

现在来演示一下.c和.h不在同一在其他目录中的写法,这里我把mul.c和head.h他们移动到上一级目录中的m目录中了


2.因为上面这个版本的makefile挫到辣眼睛,就简单的把我们写的命令搬到了makefile文件中而已,而且有一个很大的问题,就是假如我修改了其中的一个文件的话,所有文件又得重新编译,这样的话效率及其低下,所以下面我们来看第二个版本的makefile

先介绍一下这个makefile的执行过程,这样写的话appj就是终极目标,而下面的test.0等等就是子目标,首先要生成目标文件app,查找第一个依赖test.o发现没有然后向下查找规定看看有没有哪个规则生成test.o这个依赖,发现第二条规则就是生成test.o的,所以执行gcc -c test.c 生成test.o这个时候test.o有了继续向后查找add.o....过程和test.o是一样的

这样写的话我们试试看改变一个.c文件的话是不是只编译这个.c文件(这里我给test.c中加个空白行)


注意:终极目标一定放在第一个。因为默认第一个规则就是生成的终极目标的规则,而下面的东西都是为生成终极做的准备。

所以这种写法当我们修改了一个文件的时候只单独编译这个文件,那么系统是如何知道哪个文件更新了哪个文件没有更新的呢?

解释如下:


3.其实这个版本的makefile也有很多要更改的地方因为有很多的重复的地方太过于冗余了,所以我们来看第三个版本的makefile


然后我们make的话和之前的效果是一样的。

上面这种方法用的就是makefile中的变量的方法,当然除了我们自己定义的这些变量makefile中也有自己维护的一些变量

比如CC在这里他的默认值是cc其实cc就是gcc我们当然也可以将其值改成gcc----CC=gcc,注意这里系统维护的变量都是大写的。

4.最后来介绍makefile中函数的使用也是最后一个版本

首先强调一点makefile中所有的函数都是有返回值得,不管什么函数,在makefile函数的调用中的核心也是拿到这个函数的返回值,否则你调用这个函数就没有太大的意义。

1.第一个函数:wildcard

获取所有.c的函数,参数是.c文件的路径,返回值是获取到的.c文件以字符串的方式返回

2.第二个函数:patsubst

匹配替换函数,用法我下面一起介绍


最后要说的一定是我们每次make的话就会生成一堆.o文件,看着很头大,也影响测试,所以我们可以使用如下方式将其清除掉


最后只需要在命令中make clean就可以了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值