论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
运维.售后
›
运维.售后
›
【Linux】make下令 | makefile文件详解
【Linux】make下令 | makefile文件详解
徐锦洪
论坛元老
|
2025-3-17 08:21:42
|
显示全部楼层
|
阅读模式
楼主
主题
1816
|
帖子
1816
|
积分
5448
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
目录
前言:
一、预览功能
二、依赖关系和依赖方法
三、清理项目
四、makefile中写入其他Linux下令
五、PHONY关键字
1.文件时间信息(stat下令)
六、makefile实行下令序次
七、makefile使用本领
八、天生多个可实行文件
总结:
前言:
我们是否可以在Linux上面不安装编译器,也可以使每次写的代码编译运行?也就是不消每次都是用gcc编译出一个可实行文件,之后修改了源文件之后又删除天生的可实行文件再gcc天生可实行文件。
接下来我们就来详细解说两个相干的知识:make下令和makefile。他们可以快速的提升编程服从。
一、预览功能
我们先来预览一下他们的团体功能。此时我们写一个proc.c文件,并在里面写入一些内容:
此时我们新建一个Makefile/makefile文件,这两个名字都可以。并向Makefile中写入以下内容:
此时我们直接在下令行中输入make,就会发现天生了一个proc可实行文件。
此时你大概会说,这看起来步骤反而变多了,没错,到这步确实是变多了,但是我们接下来要深入学习你就会发现,这个文件真的用起来很爽。
二、依赖关系和依赖方法
我们来看一下makefile文件中的语句分解:
什么是依赖关系?什么是依赖方法?
打个比方:你和你爹,这个就是依赖关系;此时你问你爹要钱,这个就是依赖方法。
以是必须现有依赖关系,之后才有依赖方法(大家不要想的很复杂) 。
此时就好解释了:形成proc可实行步伐依赖proc.c,以是互不可缺;但是只有依赖关系不行,我们还要有依赖方法,要表明如何形成可实行步伐。
makefile本质就是依赖方法的聚集。
三、清理项目
如何清理项目?此时我们在Makefile中再参加如下几条语句:
.PHONY:clear
clear:
rm -f proc
复制代码
之后实行如下下令(make clear):
这里大家肯定都一头雾水,这是为啥?(插一句:phony假的)
留意这里的定名可以更改,比如:
你可以发现clear目的文件右边没有依赖文件。
此时你会好奇,岂非第一次直接make就可以天生可实行文件吗?可不可以make proc?其实也可以:
这是由于makefile文件是从上到下扫描的,第一行的依赖关系make proc中的proc可以省略掉。
以是我们也可以把clear放在首行,比如我们作出以下修改:
但是我们一样平常建议把清理下令(清理的依赖关系)放在最后。
小总结:makefile文件,会被make从上到下开始扫描,第一个目的名,是可以直接用make省略目的名形成的;假如我们要实行其他组的依赖关系和依赖方法:make name.
四、makefile中写入其他Linux下令
此时你会想:rm 了、gcc 了这些下令归根结底还是Linux中的下令行,那么是不是我们在依赖方法中写入也可以实行呢?
此时我们先补充一下:
#在makefile文件中可以注释。
此时我们将Makefile的内容做以下修改:
但是还是很烦,由于每次把下令行也显示出来了,此时我们要将下令行隐藏。
隐藏下令行要使用@符号(@是关闭下令回显)。
唉!此时是不是可以增加一些提示信息呢?比如:
此时我们故意项文件中参加报错信息,看看运行结果:
此时我们修正代码:
五、PHONY关键字
此时我们不停实行make下令看看是什么效果:
再不停实行make clear下令:
此时把PHONY语句给注释了并再次不停实行make clear下令:
我们可以发现,似乎有PHONY和没有它都一样,这里我们把PHONY放到第一行并观察实行结果。
此时我们发现,用PHONY修饰第一行依赖关系的目的文件,每次都可以实行。以是.PHONY让目的文件对应的方法,总是被实行。此时我们再来看一个征象:
偶然候必要重新编译,偶然候不必要,这是为什么?
1.文件时间信息(stat下令)
对于源文件和可实行文件,都是文件。
文件 = 内容 + 属性
我们用
stat下令
来检察一个文件或文件系统的状态信息:
至于Access对应的时间是文件被访问的时间,由于这个频率太高了,频仍修改影响服从,以是它的修改时间我们不做讨论。
此时我们先修改proc.c权限,之后修改proc.c内容:
此时我们来对比proc和proc.c文件的时间区别:
这里再回到之前的问题,此时我们再Makefile中将PHONY放在第一行,并把PHONY修饰的clear给删除:
PHONY让依赖方法忽略掉时间对比,但是为什么make clear却不停实行呢?由于clear中的依赖方法rm -f file本身就不关心时间。以是可以不停实行make clear。
六、makefile实行下令序次
我们之前在gcc章节讲到过(vim编辑器和gcc编译器-CSDN博客),天生一个可实行文件是颠末预编译、编译、汇编、链接的步骤的。我们可以在makefile中把详细的实行步骤写入:
Makefile实行序次为从上到下实行,此时文件中它先找有没有proc.o依赖文件,没有将的话会将依赖方法放入栈中……如下图:
make解释makefile的时候,是会自动推导的,不停推导,此时不会实行依赖方法(将依赖方法放入栈中),直到推导到有依赖文件的存在,然后逆向实行所有依赖方法。
这里插一句,我们假如没有目的文件直接-c会直接天生同名汇编的.o文件:
但是我们一样平常不会这么写,太冗长了,我们一样平常如许写:
这是由于你在Windows中,一样平常天生可实行文件时,是会天生一个同名的.obj文件的,以是我们一样平常会如许写makefile。
七、makefile使用本领
当我们写一个项目时,大概不止一个.c文件,此时假如我们想像C语言一样,可以使用宏更换,假如要修改文件,只必要把宏给更换即可,不必要一个一个更换变量,makefile可以吗?当然可以,由于makefile支持通配符,以是可以如许使用:
makefile也可以界说变量,可以不消带类型。此时我们再修改一下makefile文件:
由于将来我们不大概只有一个.c文件,以是利用此方法有点像C语言中的宏界说。
而且我们还可以如许修改:
以是终极的makefile版本应该这么写。
八、天生多个可实行文件
此时我们再写一个code.c文件,并修改makefile文件:
此时可以发现只形成了一个proc可实行文件,由于我们在Windows中也是默认形成一个,但是Linux中可以一次形成多个,此时就必要使用其他本领了:
天生all就要天生proc和code,此时没有源文件,之后继续向下实行依赖方法(依赖方法入栈),终极会天生proc和code可实行文件,并天生all目的文件。
总结:
此时我们已司明白了大部分的makefile的原理,当前知识已经完全够我们使用,接下来我们先利用这些已学过的知识来完成一个进度条小项目(下一篇敬请期待)。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
徐锦洪
论坛元老
这个人很懒什么都没写!
楼主热帖
彻底卸载SQL Server
马丽明:选择超融合架构的三个要素 ...
【计算机网络】TCP为什么需要3次握手 ...
java数据库开发与实战应用,2022最值得 ...
漏洞扫描工具nessus、rapid7 insightvm ...
Oracle夺命连环25问,你能坚持第几问? ...
c# 实现定义一套中间SQL可以跨库执行的 ...
iOS16新特性 | 灵动岛适配开发与到家业 ...
WPF工控组态软件之冷却塔和空气压缩机 ...
几种数据库jar包获取方式
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Mysql
MES
云原生
公有云
Postrge-SQL技术社区
快速回复
返回顶部
返回列表