论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
主机系统
›
linux
›
makefile 知识点小结
makefile 知识点小结
泉缘泉
论坛元老
|
2024-6-14 16:40:54
|
显示全部楼层
|
阅读模式
楼主
主题
1729
|
帖子
1729
|
积分
5197
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
目录
makefile 定义变量的方式
1.递归定义
2 直接定义
3 条件定义方式
4 追加变量值
5 引用并修改变量值
6 override
VPATH用法:
1 VPATH vpath
各种规则
1.隐式规则(Implicit Rules)
2.静态规则(Static Pattern Rules)
3. 多目标规则(Multiple Target Rules)
4. 双冒号规则(Double-Colon Rules)
总结
makefile 定义变量的方式
1.递归定义
A=I love $(B)
B=China
复制代码
变量A的定义包罗了对变量B的引用,会在全文举行搜索变量B的值,此时A=I love China。
但这种定义方式有明显的缺点,即当接纳类似于A=$(A)的结构,就会无限嵌套迭代,最终使make执行失败。
2 直接定义
B=China
A:=I love $(B)
复制代码
此时,变量A通过“:=”直接定义,假如在前面的部分出现其引用的变量,则会举行定义,假如没出现,则不会定义。此处,A=I love China;假如变更位置,如下:
A:=I love $(B)
B=China
复制代码
此处,变量A定义前,B还没有定义,则A的值不包括China.
3 条件定义方式
A=apple
A?=I love banana
复制代码
此处对A举行了两次定义,第二次使用了“?=”举行条件定义,其寄义是,假如在变量A条件定义前没有定义,则定义为“I love banana”,否则就维持原值。个人将其理解有点类似于条件编译:
#ifndef A
#define A
复制代码
4 追加变量值
A=apple
A+=banana
复制代码
上式中,A=applebanana较易理解,不过多表明
5 引用并修改变量值
A=apple.c banana.c pear.c
B=$(A:%.c=%.o) #此处%是适配符,个人理解为调用的时候,前后值统一
复制代码
此处,第2行的意思是,将变量A中所有的.c后缀文件改名为.o文件,得到的结果是
B=apple.o banana.o pear.o,和patsubst(makefile内嵌函数)功能类似。
6 override
在终端执行make命令时,通常可以携带一个变量的定义,并且会覆盖makefile文件中的定义。该命令和追加通常一起使用,用法如下:
覆盖变量定义
:
makefileCopy CodeCFLAGS := -O2
override CFLAGS := -g -Wall
复制代码
在这个例子中,override 强制覆盖了之前定义的 CFLAGS 变量。即使 CFLAGS 在 Makefile 的其他位置已经被定义,使用 override 会使得新的值 -g -Wall 生效。
在包罗其他 Makefile 中使用
:
makefileCopy Codeinclude external.mk
override CFLAGS += -I$(DIR_INC)
复制代码
这里,external.mk 可能会定义一些编译选项或者其他变量,使用 override 可以确保不管 external.mk 中怎样定义 CFLAGS,我们都能在其底子上添加 -I$(DIR_INC)。
VPATH用法:
1 VPATH vpath
VPATH 和 vpath 都用于指定 Make 工具在搜索文件时应该查找的路径列表,特别是当 Makefile 和源文件不在同一目录下时,这两个指令非常有用。
VPATH 指令是 Makefile 的一个变量,用于设置搜索文件的路径列表。它可以是一个以冒号分隔的目录列表,类似于环境变量 PATH 的用法。比方:
makefileCopy CodeVPATH = src:include:../headers#设置了三个目录:`src`、`include` 和 `../headers`。当 Make 需要查找文件时,会按照这些目录的顺序进行搜索。
复制代码
vpath 是一个 Makefile 的函数式指令,用于临时设置某些文件的搜索路径。它的语法情势如下:
vpath %.c src:../common
复制代码
这个例子中,.c 末了的文件会在 src 和 ../common 目录中搜索。
各种规则
在 Makefile 中,有多种类型的规则,每种规则具有不同的特点和用途。以下是对几种常见规则的详细介绍:
1.隐式规则(Implicit Rules)
隐式规则是 Make 内置的一些通用规则,用于处理惩罚常见的构建任务。这些规则不必要明确地写在 Makefile 中,Make 会自动应用它们。比方,Make 知道如何从 .c 文件生成 .o 文件,因此你不必要为每个 .c 文件单独写一个规则,如下:
OBJS = main.o utils.o #设置变量
main: $(OBJS)
$(CC) -o $@ $(OBJS)#相当于gcc -o main main.o utils.o
复制代码
特点
:
简化 Makefile,减少重复代码。
自动处理惩罚常用构建步调。
可以被用户自定义的规则覆盖。
2.静态规则(Static Pattern Rules)
静态规则答应你为一组文件定义一个共同的构建规则,特别适合处理惩罚类似的一批文件。它们使用模式字符串(%)来匹配目标文件和依赖文件。
OBJS = main.o utils.o
$(OBJS): %.o: %.c
$(CC) -c $< -o $@
复制代码
特点
:
适用于多个目标文件共享类似的构建逻辑。
使用模式字符串举行匹配。
3. 多目标规则(Multiple Target Rules)
多目标规则答应你为多个目标指定类似的命令。这在多个文件必要执行类似利用时非常有用。
clean-exe clean-obj clean-log:
rm -f *.exe *.o *.log #*通配符,和%适配符不同
复制代码
特点
:
一条规则定义多个目标。
共享类似的命令。
4. 双冒号规则(Double-Colon Rules)
双冒号规则答应你为同一个目标定义多个独立的规则。每个规则都会被执行一次,而不是覆盖前一个规则。这在必要多次处理惩罚同一个目标时有用。
update:: file1
cp file1 /backup/
update:: file2
cp file2 /backup/
复制代码
特点
:
同一个目标可以有多个规则,每个规则都会被执行。
不会覆盖先前的规则。
总结
隐式规则
:自动应用常见的构建规则,简化 Makefile。
静态模式规则
:为一组文件定义共享的构建逻辑,使用模式匹配。
多目标规则
:为多个目标指定类似的命令,简化处理惩罚多目标的情况。
双冒号规则
:答应为一个目标定义多个独立的规则,全部执行。
根据详细的需求和场景选择合适的规则,可以有效地简化和优化 Makefile 的编写。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
泉缘泉
论坛元老
这个人很懒什么都没写!
楼主热帖
华为一镜到底主题__荣耀30系列安装教程 ...
「Docker入门指北」容器很难理解?带你 ...
日志模块
数据资产为王,如何解析企业数字化转型 ...
信创环境下分布式文件存储MinIO集群部 ...
28基于java的简单酒店数据管理 ...
xss-labs靶场
Vulnhub之M87靶机详细测试过程(不同提 ...
解决NuGet加载或下载资源慢的问题 ...
Java 8 排序的 10 个姿势,太秀了吧! ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
程序人生
SQL-Server
物联网
Oracle
运维.售后
快速回复
返回顶部
返回列表