15.Make的隐式规则

qemu(2) -- 定制开发板 向qemu源码中添加自定义开发板 阅读详情

15.1.命令覆盖

问题1:通过各目标的命令拆分写到不同的地方,会发生什么?

.PHONY : all 

VAR := test

all : 
    @echo "all : $(VAR)"

include 1.mk

文件1.mk内容:

all : 
    @echo "this is command from 1.mk"

Makefile中出现同名目标时:
依赖:所有的依赖将合并到一起,成为目标的最终依赖
命令:当多处出现同一目标的命令时,make发出警告,所有之前定义的命令被最后的命令取代。
注意:
当使用include包含其他文件(makefile)时,需要确保被包含的文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖!

15.2.隐式规则

Make中提供了一些常用的,例行的规则实现,当目标的规则未提供时,make尝试使用隐式规则
下面的代码可以编译成功吗?为什么?

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

app.out : $(OBJS)
    $(CC) -o $@ $^
    $(RM) $^
    @echo "Target ==> $@"

%.o : %.c
    @echo "my rule"
    $(CC) -c -o $@ $^

根据我们的初步分析,上面的Makefile中存至少两个问题:
1.没有定义CC 和RM变量而直接使用
2.没有定义生成.o文件的规则(只有链接没有编译)
运行结果:
makefile(06)_隐式规则
为什么可以成功运行,原因在于make中的隐式规则。
Make中提供了生成目标文件的隐式规则,会使用预定义变量完成编译工作;
改变预定义变量间部分改变隐式规则的行为,当存在自定义规则时,不再使用隐式规则。

16.Make的隐式规则

16.1.隐式规则的弊端

目标的依赖不存在时,make会尝试通过依赖名逐一查找隐式规则,并通过依赖名推导出可能的源文件。
makefile(06)_隐式规则
这种行为看起来简化了makefile的写法,但可能会带来意想不到的问题。
隐式规则副作用:

  • 编译行为难以控制,大量使用隐式规则可能产生意想不到的编译行为
  • 编译效率低下:make从隐式规则和自定义规则中选择最终的规则
    举例说明:
    makefile:

    app.out : main.o func.o
     $(CC) -lstdc++ -o $@ $^

    main.c:

    #include <stdio.h>
    extern void greeting();
    int main()
    {
    greeting();
    
    return 0;
    }   

    由于我们并没有定义greeting这个函数,所以我们猜测编译时会报告链接错误,找不到greeting这个符号。
    实际输出结果:
    makefile(06)_隐式规则
    我们看到这里直接使用func.p文件生成func.o文件,但由于我的环境中没有安装pc这个软件,所以报错。整个过程完全和我们预期不同。
    隐式规则链:
    当依赖的目标文件不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为!
    例:需要名为N.o的目标:N.y --> N.c --> N.o
    我们可以直接使用make -p命令来查看所有的隐式规则,
    makefile(06)_隐式规则

16.2.隐式规则的禁用

1.局部禁用:在Makefile中自定义规则,如定义一个只有目标和依赖,没有命令的规则,如:

%.o : %.p

这样就可以使用我们自定义的规则,而非隐式规则
2.全局禁用

make -r

显然这种简单实用,推荐使用

16.3.后缀规则

后缀规则时旧式的“模式规则”,可以通过后缀描述的方式自定义规则
1.双后缀规则:定义一对文件后缀(依赖文件后缀和目标文件后缀)

如: .cpp  <---> %.o : %.cpp

2.单后缀规则:定义单个文件后缀(源文件后缀)

如: .c  <--->  % : %.c

注意:
后缀规则中不允许有依赖,后缀规则必须有命令,否则无意义
已经逐步被模式规则替代,建议直接使用模式规则

转自:https://blog.51cto.com/11134889/2108284

基于MATLAB编程的LSTM的时间序列预测 时间序列预测,回归分析,LSTM详细原理 阅读详情

相关推荐

ENVI学习总结(十二)——基于改进的 CASA 模型反演 NPP

基于改进的 CASA 模型反演 NPP 数据为地理空间数据云提供的 TM 影像,其具体信息如图 1 所示。该实验中所使用的 TM 数据已进行过 QUAC 快速大气校正,来消除大气和光照等因素对地物反射的影响。Landsat 主题成像仪(TM)是 Landsat4 和 Landsat5 携带的传感器,每 16 天扫描同一地区,即 16 天覆盖全球一次。 TM 影像包含 7 个波段,波段 1-5 ...

Arcgiser的博客 3万+

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

本篇文章将给大家介绍make的隐式规则。Make 的隐式规则是指 Make 在没有找到显式规则的情况下,会自动使用的一组规则。这些规则是预定义好的,可以被 Make 自动识别和调用,不需要用户指定具体的规则。隐式规则的使用可以大大简化 Makefile 的编写,特别是当需要编译大量源文件时。隐式规则可以根据不同的文件扩展名自动调用不同的编译命令。

m0_49476241的博客 1218

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 411

makefile(06)_隐式规则

15.Make的隐式规则 15.1.命令覆盖 问题1:通过各目标的命令拆分写到不同的地方,会发生什么? .PHONY : all VAR := test all : @echo "all : $(VAR)" include 1.mk 文件1.mk内容: all : @echo "this is command from 1.mk" Makefile中出现同名目标时:依赖...

weixin_34417635的博客 187

从零完成 STM32 + ESP-01S + 云服务器 TCP 通信测试

STM32 通过 USART3 控制 ESP-01S 接入手机 2.4 GHz 热点,随后连接公网云服务器 8.152.204.86:9002。云端在同一 TCP 连接中连续收到 seq=1~6 的测试报文,5 个发送间隔平均约 5.4 秒,说明本次 TCP 上行链路已经打通。

weixin_51387720的博客 315

基于STM32 HAL库的L298N四驱电机PWM调速与方向控制实战

本文详细介绍了基于STM32 HAL库驱动L298N电机控制板实现四驱小车PWM调速与方向控制的实战方法。涵盖硬件连接、GPIO与定时器配置、PWM生成、方向控制逻辑及电源管理等核心内容,并提供代码优化与常见问题解决方案,帮助开发者快速实现高效稳定的电机控制。

jump7的博客 222

make的隐式规则

问题 如果同一个目标的命令拆分写到不同地方,会发生什么? 下面的程序怎么执行?为什么? makefile 中出现同名目标时 依赖: 所有的依赖合并在一起,成为目标的最终依赖 命令: 当多处出现同一目标的命令时,make 发出警告 所有之前定义的命令被之后定义的命令取代 注意事项 当使用 include 关键字包含其他文件时,需要确定被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖! 命令的拆分 makefile .PHONY : all

qq_52484093的博客 1433

保姆级教程:在S32DS 3.4上安装S32K3xx RTD 4.4驱动包(附常见安装失败排查)

本文提供在S32DS 3.4上安装S32K3xx RTD 4.4驱动包的详细教程,涵盖环境准备、分步安装指南及常见问题排查。特别针对NXP S32K3系列MCU开发者,解决网络问题、路径配置等安装难点,并分享进阶配置技巧和最佳实践,助力高效开发。

weixin_42696271的博客 289

Make的隐式规则

隐式规则1:当依赖出现重名时,make将所有的依赖整合,形成最后的依赖。2:当目标中的命令出现重复时,make将发出警告,使用后来的命令执行结果来替换前面的命令执行结果,因此在makefile中使用include时应避免在include所包含的文件中使用命令。 隐式规则2:make会提供一些自定义的变量,例如:(CC),(CC),(CC),(RM ) 可以使用‘echo ‘.VARIBLES’...

qq_42518781的博客 269

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 406

微信小程序 - 解决video视频播放黑屏只有声音没有画面问题,使用Video标签无法播放视频失败只有声音、黑屏视频播放不了,安卓手机/苹果ios视频只有声音却没有画面(uniapp微信小程序也适用)

微信小程序video有声音但是画面黑屏,uni-app微信小程序视频播放黑屏但是有音频,微信小程序video android真机或苹果ios系统中黑屏 只有声音没有画面,Uniapp微信小程序 Video MP4视频播放失败,只有声音,黑屏,视频播放不了,解决办法,解决小程序视频编码兼容性问题导致黑屏,出现黑屏但有声音的问题,video标签播放视频有声音,但是黑屏的原因及解决办法,mp4视频编码的问题,video标签播放视频有声音,但是黑屏。uniapp使用video标签无法播放视频出现黑屏问题处理,如何解

🏆 前端领域优质创作者 7780

Makefile隐含规则

隐含规则————在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。“隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makefile中没

1189

【NLP】第十章:位置编码Positional Encoding

前面讲RNN时一般都会有一个ht的输出,这个输出就是样本与样本之间的信息,而且RNN是时序循环的,所以RNN本身的结构,在物理上,就自带词的前后顺序信息的。比如词never,不管never本身的词向量是什么,只要你在序列中排第一个位置,你的位置向量就是[0,1,01],你排第三个位置,你的位置向量就是[0.9,-0,4,0.2,1.0]。也所以,你可以理解为:embedding后的词嵌入,PE按照每个样本在sequence中的位置,把embedding后的词嵌入给扭转后,才送入attention的。

因为热爱所以坚持 1918

15、make中的隐式规则

如果同一个目标的命令拆分的写到不同地方,会发生什么?下面的程序怎么执行?为什么?makefile中出现同名目标时:依赖:所有的依赖将合并在一起,成为目标的最终依赖。命令:当多处出现同一目标时,make发出警告。所有之前定义的命令被最后定义的命令取代。注意事项:当使用include关键字包含其他文件时,需要确保被包含文件中的同名目标只有依赖,没有命令。否则,同名目标的命令将被覆盖。什么是隐式规则(b...

WS857707645的博客 760

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

第15课 - make 的隐式规则(上)

文章目录1. 目标拆分2. 初探隐式规则3. 总结 1. 目标拆分 mekefile 中出现同名目标时 依赖:所有的依赖将合并在一起,成为目标的最终依赖 命令:当多处出现同一目标的命令时,make发出警告,所有之前的命令将被最后定义的命令覆盖 EG: all : @echo "the one all" all : @echo "the two all" all : @echo "the three all" 执行结果: 2. 初探隐式规则 什么是隐式规则? make 提供了一些常用的,

清浅 247

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Makefile15--make的隐式规则(上)

学习自狄泰软件学院唐佐临老师Makefile课程,文章中图片取自老师的PPT,仅用于个人笔记。 将一个目标的依赖拆分的写到不同的地方,那对于依赖来说,拆分之后 make 解释器在解释执行代码的时候,就会将拆分到不同地方的依赖全部的重新组合在一起,得到一个完整的依赖集合。 相同的情况如果发生在命令上 会怎样呢? 实验1 :makefile 中出现同名目标时 .PHONY : all al...

奶牛养殖场小马 725

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

15-16 - make 中的隐式规则概述

隐式规则

嵌入式wu 972

Makefile学习之路15 - make 的隐式规则(上)

声明: 本文写于 狄泰软件学院 makefile 课程 学总结,本文版权归 狄泰软件学院 所有 问题 如果同一个目标的命令拆分写到不同地方,会发生什么? 下面的程序怎么执行?为什么? .PHONY : all all : @echo "command-1" VAR := test all : @echo "all : $(VAR)" makefile如果一个目标...

weixin_41477765的博客 264

第15课 - make的隐式规则(上)

1. 问题 如果把同一个目标的命令拆分的写到不同地方,会发生什么? 执行make all      这个实验表明了:如果同一个目标的命令拆分的写到不同地方,那么 make 会覆盖之前的目标对应的命令,使用最新出现的目标对应的命令。 makefile 中出现同名目标时   — 依赖: 所有的依赖将合并在一起,成为目标的最终依赖         — 命令: 当多处出现同一目标的命...

梦心之魂的博客 56

15.make的隐式规则(上)

新命令覆盖旧命令 没出错,得到了正确的结果 make解释器在解释代码时,发现规则没有,那么就去标准库去找隐式规则。cc:C语言编译器 标准库里相当于这样子的代码:

weixin_46258483的博客 135

教你玩转makeflie(六)make的隐式规则

makefile 中出现同名目标时依赖︰所有的依赖将合并在一起,成为目标的最终依赖命令∶当多处出现同一目标的命令时,make发出警告所有之前定义的命令被最后定义的命令取代当使用include关键字包含其它文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖! 若去掉一部分会编译成功吗?会的当依赖的目标不存在时,make 会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编...

Exp.Joker 645

makefile-06-隐式规则

15.Make的隐式规则http://blog.51cto.com/11134889/2108284 15.1.命令覆盖 问题1:通过各目标的命令拆分写到不同的地方,会发生什么? .PHONY : all VAR := test all : @echo "all : $(VAR)" include 1.mk 文件1.mk内容: all : @echo "this...

IoT的搬运工!!! 231

GNU make翻注

该make实用程序会自动确定大型程序的哪些部分需要重新编译,并发出命令对其进行重新编译. 本手册介绍了由Richard Stallman和Roland McGrath实现的GNU make。处理了自3.76版以来的开发。GNU make符合IEEE标准1003.2-1992(POSIX.2)的6.2节。我们的示例显示了C程序,因为它们是最常见的,但是您可以将make用于任何可以使用shell命令运行编译器的编程语言。实际上,make并不局限于程序。

qq_41720266的博客 1024

为什么你的AI Makefile总在CI失败?揭秘gcc版本嗅探失效、隐式规则覆盖、phony误判这3大暗礁

AI写Makefile常因gcc版本嗅探失效、隐式规则覆盖和phony误判导致CI失败。本文剖析三大典型问题成因,提供可验证的修复模板与跨环境适配方法,适用于GitHub Actions等主流CI场景。掌握后显著提升构建稳定性,值得收藏。

CodeNexus的博客 193

make工程管理器

make指令的使用心得。

码到功成 530
上一篇: vmware中外部windows与redhat虚拟机简便的文件共享方式
下一篇: makefile中的all和.PHONY的作用
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值