Makefile基础教程(make的隐式规则)

这篇具有很好参考价值的文章主要介绍了Makefile基础教程(make的隐式规则)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本篇文章将给大家介绍make的隐式规则。

一、什么是make的隐式规则

Make 的隐式规则是指 Make 在没有找到显式规则的情况下,会自动使用的一组规则。这些规则是预定义好的,可以被 Make 自动识别和调用,不需要用户指定具体的规则。

隐式规则的使用可以大大简化 Makefile 的编写,特别是当需要编译大量源文件时。隐式规则可以根据不同的文件扩展名自动调用不同的编译命令。

二、makefile中出现同名目标时

在 Makefile 中,如果出现了同名的目标,则后面出现的目标会覆盖前面同名的目标。这种情况可能会导致不可预期的错误,因此需要特别注意。

例如,以下 Makefile 中存在两个同名的目标 all:

all: target1
    @echo "build complete"

target1:
    @echo "building target1"

all: target2
    @echo "build complete"
    
target2:
    @echo "building target2"

在这个 Makefile 中,第二个 all 目标将覆盖前面的 all 目标,因此执行 make 命令时只会编译执行第二个all中的命令,而不会执行第一个all中的命令。

执行结果:
Makefile基础教程(make的隐式规则)

三、一些常见的隐式规则

大家觉得下面的makefile可以正确执行吗?在这里我们并没有生成对应的.o文件。

SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)


hello : $(OBJS)
	$(CC) -o $@ $^
	@echo craet file ok

执行结果:
执行结果却出乎我们的意料,明明没有生成对应的.o文件啊,为什么还是正确执行呢?这就是因为make的隐式规则。

在make中包含这样的一条隐式规则:C 源文件编译为目标文件:%.o: %.c。
当make发现没有对应的规则时就会调用到这个隐式规则。
Makefile基础教程(make的隐式规则)

四、查看隐式规则

使用make -p命令可以查看隐式规则:
这里隐式规则是有非常多的,这里就不一 一进行讲解。
Makefile基础教程(make的隐式规则)

五、隐式规则缺点

虽然隐式规则可以方便地简化 Makefile 的编写工作,但是使用隐式规则也存在一些缺点:

可能导致编译错误:隐式规则会自动推导源文件和目标文件之间的关系,但不一定符合实际情况。如果隐式规则的规则不适合当前项目的情况,则可能导致编译错误。

难以定制要求:隐式规则通常是基于一些默认的编译选项,而这些选项可能不符合用户的需求。通过隐式规则,用户难以对编译选项进行修改和自定义配置。

可读性较差:隐式规则隐藏了 Makefile 的具体细节,使 Makefile 更加难以理解和调试。由于隐式规则并不直接体现在 Makefile 中,因此难以准确理解每个目标和规则之间的关系。

综上所述,隐式规则虽然提高了 Makefile 编写的效率和可读性,但在一些情况下可能会导致编译错误、难以定制编译选项和可读性差等问题。因此,对于较大和复杂的项目,最好使用显式规则来更加精确地控制编译过程和生成的目标文件。

六、禁用隐式规则

1.全局禁用

使用make -r命令全局禁用隐式规则:

这里使用make -r命令来执行上面编写的makefile:

执行结果:
从结果可以看出隐式规则被禁用了,没有起作用了。
Makefile基础教程(make的隐式规则)

2.局部禁用

局部禁用的方法就是定义自己的规则和变量。
修改代码后:

CC := gcc

SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)


hello : $(OBJS)
	$(CC) -o $@ $^
	@echo craet file ok

$(OBJS) : %.o : %.c
	$(CC) -o $@ -c $^
	@echo this is myrule

运行结果:
Makefile基础教程(make的隐式规则)
跟上面的运行结果做一个对比后就知道在定义了自己的规则后就不会使用到make里面的隐式规则了。

总结

本篇文章我们介绍到了make中的隐式规则,使用隐式规则可以帮助我们节省代码的编写量,但是有的时候却会出现意想不到的错误,使用局部禁用和全局禁用的方法可以让make不使用隐式规则,希望大家牢牢记住这篇文章的内容防止以后在开发中遇到问题。文章来源地址https://www.toymoban.com/news/detail-459285.html

到了这里,关于Makefile基础教程(make的隐式规则)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 的隐式转换导致诡异现象的案例一则

    正是因为 MySQL 对字符串进行隐式转换时会截断再转,而不是像 Oracle、SQL Server 这些数据库针对这种问题直接报错,所以才出现了这个诡异的问题。 作者:刘晨 网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Or

    2024年02月10日
    浏览(31)
  • Selenium中的隐式等待和显式等待

    在Selenium中,“等待”在执行测试中起着重要作用。在本文中,您将学习Selenium中“隐式”和“显式”等待的各个方面。 在本文中,您将学习到 1. 为什么我们需要在selenium中等待? 2. 隐瞒等待 3. 明确等待 4. 流利的等待 为什么我们需要在Selenium中等待? 大多数Web应用程序都

    2024年02月07日
    浏览(34)
  • [Linux 基础] make、Makefile自动化构建工具

    make是一个命令,Makefile是一个在当前目录下存在的一个具有特定格式的文本文件。 在VS编译器中,我们在编译执行代码的时候ctrl+f5就可以了,而在linux中我们需要使用gcc/g++ 配合选项并需要正确的格式才可以完成编译,这样是比较麻烦的,我们make与Makefile可以实现自动化构建

    2024年02月06日
    浏览(30)
  • 『Linux升级路』基础开发工具——make/Makefile篇

    🔥 博客主页: 小王又困了 📚 系列专栏: Linux 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识make/Makefile 📒1.1make/Makefile的优点 📒1.2make/Makefile的使用 二、依赖关系和依赖方法 📒2.1依赖关系 📒2.2依赖方法 三、make工作原理 🗒️ 前言:

    2024年02月05日
    浏览(24)
  • [Linux 基础] make、Makefile自动化构建代码工具

    make是一个命令,Makefile是一个在当前目录下存在的一个具有特定格式的文本文件。 在VS编译器中,我们在编译执行代码的时候ctrl+f5就可以了,而在linux中我们需要使用gcc/g++ 配合选项并需要正确的格式才可以完成编译,这样是比较麻烦的,我们make与Makefile可以实现自动化构建

    2024年02月08日
    浏览(32)
  • Linux基础——Linux开发工具(make/makefile,git)

    前言:在经过前面两篇学习,大家对Linux开发工具都有一定的了解,而在此之前最重要的两个工具就是vim,gcc。 如果对这两个工具不太了解,可以先阅读这两篇文章: Linux开发工具 (vim) Linux开发工具 (gcc/g++) 首先让我们来初步了解一下本篇的目标: 1. 学习make/makefile,并能简单

    2024年04月27日
    浏览(28)
  • 【Linux系统化学习】基础开发工具——make和makefile

    ========================================================================= 个人主页点击直达: 小白不是程序媛  Linux学习专栏: Linux系统化学习 ========================================================================= 目录 前言: 初始make和makefile makefile的好处 make和makefile的区别 make和make的使用 依赖关系和依

    2024年02月05日
    浏览(52)
  • 【linux基础(七)】Linux中的开发工具(下)--make/makefile和git

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到开通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 如果你不知道什么是vim和gcc 请先阅读这两篇文章后再学习本节: 文章一: vim和yum 文章二: gcc/g++ 本章重点: 本篇文章会着重讲

    2024年02月08日
    浏览(28)
  • Linux基础工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【详解】

    1.在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。 2.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包

    2024年01月17日
    浏览(39)
  • 【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景🌍 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥集中起来的意志可以击穿顽石🔥 🙏作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注!🎉🎉

    2024年01月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包