论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
运维.售后
›
运维.售后
›
【Linux】Make/Makefile
【Linux】Make/Makefile
惊雷无声
金牌会员
|
2024-12-5 01:12:45
|
显示全部楼层
|
阅读模式
楼主
主题
826
|
帖子
826
|
积分
2478
这个3/4行的语法和1/2行是一样的。也是依赖关系和依赖方法。
make命令扫描makefile文件时,从上向下扫描,默认形成一个目标文件。
指定make clean的时候才归去执行对应的清除。
为什么要给我们的clean.PHONY:clean声明它是伪目标呢?
PHONY雷同一种发起性的关键字。
伪目标,表示对应的依赖方法和依赖关系总是被执行。
什么叫不被执行?
我们上面的这组可执行程序没有被修饰,以是我们如果make完又make,是不会执行的。但如果用为目标修饰了,就会发现也可以执行。
以是我们一样平常可执行程序不用伪目标修饰,因为如果代码没有更新,没有必要再次编译。
默认老代码不作重新编译。
make怎么知道bin和.c的新旧?
Linux下每一个文件有三个相关时间,分别是Access/Modify/Change
文件=内容+属性
cat打印内容,ls打印属性
如果我们只改文件内容,那么Modify时间被修改。
如果我们只改文件属性,那么Change时间被修改。
如果不修改,单纯查看,Access时间被更新。
可以看到,这样我们的Modfiy时间就被改了。
而且文件属性页同步变化了,以是时间也改了:
巨细和时间本就是文件的属性,以是根本都会同时修改。
更改这个权限,我们就是只改属性。
如果过于高频因为查看就更新时间,会有许多隐性的本钱。以是linux现在查看上若干次才会更新一次Access时间,详细多少次看详细系统。
我们知道,myproc.c的Modify时间应当是要比myroc早的。以是make可以以此为依据判断myproc.c是否被修改过了。
我们曾经说过,touch可以用来改文件时间:
比如带上-a,就可以只改Access时间。
如果什么选项都不带,就会把ACM三个时间全部更新。
以是通过touch更改时间,也能使我们重复使用make。
以是PHONY的作用就是修饰后总是被执行,如果我们用其修饰第一组的代码,我们就可以重复使用make。
在makefile中注释代码我们使用#来注释。
makefile会在本身内部维护一个雷同栈布局的东西。
makefile推导规则
从上往下扫描,从下往上执行。
当我们从上往下扫描,一条找不到时就入栈。以是就包管了我们最后找到myproc.c时,从下往上的执行顺序。
当然我们一样平常不会这么去写整个过程,本身增长难度。
makefile也允许我们去定义变量。以是我们写makefile一样平常喜好这样写:
如果改写成这样:
就不会回显命令。
这样,BIN是我们的目标文件,CC是编译器,SRC是源文件,FLAGS是方法。我们将这组变量打印。
$(BIN)就是取它的内容。
以是我们
全以变量的形式出现
了。这就是一个基于变量版本的makefile了。
有点像宏。
以是我们也能猜出,这样做的好处也就是替换详细的文件时不用改后面的代码了,只要在变量处稍作修改。
其实,还可以写得更加优雅:
$@代表的是目标文件,$^代表的是依赖的众多文件列表。
我们的依赖方法泉源不止一行。
我们可以把默认的显示信息用@关闭,然后写本身的信息:
但我们发现照旧将echo回显了,于是我们继承优化:
多文件呢?
而且,我们并不喜好直接从.c到可执行文件,而是喜好先从.c到.o,原因以前说过,为了方便去链接C语言库等,以是我们要改写。
LFLAGS的L代表link。OBJ代表.o文件。
.o文件从哪来的?以是我们要再写一组依赖关系和方法。但是一样平常我们的.c文件和以此生成的.o文件不止一个,为了简写,我们使用%.o:%.c这样来写我们的依赖关系。%就像makefile模式下的通配符;在依赖关系中我们也简写为:$(CC) $(FLAGES) $<,也是gcc -c $<,这里<用来简写所有的.c文件。
我们知道,gcc -c myproc.c -o myproc.o可以帮我们从.c文件编译到.o文件。
然后,gcc -c myproc.c则可以帮我们直接编译出同名.o文件。
这也就是为什么上面我们写成$(CC) $(FLAGS) $<
优化:
这个地方,我们可以SRC=$(shell ls *.c)执行ls *.c的命令,然后把对应所有的源文件放在SRC中。就不用我们一个一个手写要的源文件了。
第二种做法:
makefile天生自带雷同函数的东西,可以支持我们这样写:SRC=$(wildcard *.c)
也是雷同通配符。
以是我们的OBJ同样也需要这样可以或许使用雷同通配符的效果,来制止一个一个手写。
OBJ=$(SRC:.c=.o)
这就是最终的makefile。
我们这样来创建100个文件:
不用改刚才的makefile文件了,可以直接这样使用make和make clean:
Makefile尚有其他语法,日后可以再学。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
惊雷无声
金牌会员
这个人很懒什么都没写!
楼主热帖
基于 Sealos 的镜像构建能力,快速部署 ...
Linux之iptables(NAT表)——实验篇 ...
记一次实战 Shiro反序列化内网上线 ...
蚂蚁金服杨军:蚂蚁数据分析平台的演进 ...
数据湖(一):数据湖概念
Linux(CentOs7)基础配置及安装本地yum ...
学习TraceLogging事件,使用ETW记录, ...
联合评测 DapuStor Roealsen5 NVMe SSD ...
超融合走向红海,下一代超融合是新蓝海 ...
Neo4j
标签云
挺好的
服务器
快速回复
返回顶部
返回列表