Linux自动化构建工具make和Makefile怎么使用
发布时间 - 2023-05-14 00:00:00 点击率:次一、make和Makefile的作用
在一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作。
所以,makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,就可以完成项目自动化构建。
二、make和Makefile的使用
在了解依赖关系和依赖方法之前,我们来写一个C语言的小程序。
我们创建了一个make.c的文件,并写上了一句hello make的代码。
那么我们再创建一个Makefile文件(makefile也可以,但不建议)。
然后我们编辑Makefile文件并写上如下代码:
然后我们保存退出。
然后我们可以执行make命令。如果提示make不存在,则是因为没有安装,可以切换至root身份安装。安装代码:yum install make 或者 sudo install make。
正常执行make后会出现如下显示。
然后我们ll来查看当前目录下的文件。
我们可以发现多了一个可执行程序make。那我们运行用 ./make 运行试试。
我们会发现这个可执行程序输出make。
这就是我们的自动化构建工具,只需要在Makefile里面配置一下。往后直接输入make即可编译代码。那我们再输入一次make试试。
提示我们 make程序是最新的。 也就是说,如果你没有修改或者更新程序的话。 那么则不会为你编译,因为你程序都没动呀,编译它干嘛。
那么此时我们回过来分析一下 Makefile里面写的代码。
首先我们把它分为三部分
make
make.c
gcc make.c -o make -std=c99
这三者的关系就是, make 是依赖于 make.c 产生的。 它们两者有依赖关系 , 而gcc make.c -o make -std=c99则是 make 依赖于 make.c的方法,叫依赖方法。
什么是依赖关系和依赖方法?
打个比方。
月底了,你的生活费用光了。 这个时候你给你爸爸打电话,和他说:“爸,月底了。我没钱了。"。此时你的爸爸就知道了,会给你打生活费。 这里面,你和你的父亲是父子关系,所以你依赖于你的父亲,你们之间有依赖关系。而你的父亲给你生活费,这是你依赖父亲的一种方式,所以这就是依赖方法。如果此时你给你室友的父亲打电话要生活费,他会直接让你滚。因为你们根本不构成依赖关系,不构成依赖关系就没有依赖方法。
所以我的程序也是一样的。 make 是生成的可执行程序。 而它依赖于make.c,因为它是从 make.c编译来的。而依赖方法则是 执行 gcc make.c -o make -std=c99 这条命令。
依赖关系的原理
make会在当前目录下找名字叫“Makefile”或“makefile”的文件。如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件, 并把这个文件作为最终的目标文件。如果hello文件不存在,或是hello所依赖的后面的test.o文件的文件修改时间要比test这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果 找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程)当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 test.o 文件声明 make的终极任务,也就是执行文件test了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文 件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。
清理
我们平时在写代码的时候,经常会需要反复编译,执行代码。
而在下一次重新编译之前,需要清理一下上次生成的可执行程序。但是清理的时候可能清理错误,不小心把源文件删了,这时又造成了问题。
那么我们有没有方法解决呢?答案是当然有。
我们继续编辑Makefile文件。
我们在原有的基础上加上了
.PHONY:clean clean: rm -f make
那么.PHONY有什么作用呢?
.PHONY修饰的是一个伪目标的,伪目标总是被执行的。clean是自己定义的一条make指令,使用方法为 make clean
那我们来试试吧这条指令
我们可以看到它被清理了,那为什么说伪目标它总是被执行的呢?我们多次执行它看看。
我们可以一直执行它,那么我们多次执行make呢?
我们会发现,make执行了一次,就无法执行了,因为没有被.PHONY修饰。那么我用.PHONY修饰它再试试。
然后我们保存退出,多次执行make
我们就可以看到它被多次执行了。但我觉得没有这个必要,因为文件没有被修改的话。重新编译没有意义,所以自动化编译不建议加上.PHONY
我们保存退出,多次执行make
我们就可以看到它被多次执行了。但我觉得没有这个必要,因为文件没有被修改的话。重新编译没有意义,所以自动化编译不建议加上.PHONY
# linux
# c语言
# 栈
# 堆
# ide
# gnu
# 自动化
# 是一个
# 这就是
# 则是
# 可执行
# 我们可以
# 不存在
# 就会
# 给你
# 就可以
# 第一个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
非常酷的网站设计制作软件,酷培ai教育官方网站?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何解决hover在ie6中的兼容性问题
如何生成腾讯云建站专用兑换码?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
如何为不同团队 ID 动态生成多个“认领值班”按钮
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
HTML 中动态设置元素 name 属性的正确语法详解
专业商城网站制作公司有哪些,pi商城官网是哪个?
iOS验证手机号的正则表达式
如何正确选择百度移动适配建站域名?
zabbix利用python脚本发送报警邮件的方法
Swift中swift中的switch 语句
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
详解Android中Activity的四大启动模式实验简述
简历在线制作网站免费版,如何创建个人简历?
如何在IIS服务器上快速部署高效网站?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
微信公众帐号开发教程之图文消息全攻略
Laravel如何处理文件下载请求?(Response示例)
微信小程序 require机制详解及实例代码
公司网站制作价格怎么算,公司办个官网需要多少钱?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Python高阶函数应用_函数作为参数说明【指导】
怎么用AI帮你设计一套个性化的手机App图标?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
网站制作企业,网站的banner和导航栏是指什么?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
北京网站制作的公司有哪些,北京白云观官方网站?
深圳网站制作的公司有哪些,dido官方网站?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何在自有机房高效搭建专业网站?
如何在万网主机上快速搭建网站?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
jQuery validate插件功能与用法详解
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
如何在Windows 2008云服务器安全搭建网站?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Laravel安装步骤详细教程_Laravel环境搭建指南
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何在VPS电脑上快速搭建网站?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel如何实现数据库事务?(DB Facade示例)
php 三元运算符实例详细介绍
深圳网站制作培训,深圳哪些招聘网站比较好?


找到“hello”这个文件, 并把这个文件作为最终的目标文件。如果hello文件不存在,或是hello所依赖的后面的test.o文件的文件修改时间要比test这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果 找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程)当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 test.o 文件声明 make的终极任务,也就是执行文件test了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文 件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。