makefile make 的隐式规则

简介: makefile make 的隐式规则

前言


一、什么是隐式规则?

make 提供了一些常用的,例行的规则实现。 当相应的规则未提供时make 尝试使用隐式规则。

  • make 提供了生成目标文件 的隐式规则。
  • 隐式规则 会使用预定义变量完成编译工作。
  • 改变预定义变量将部分改变隐式规则的行为。
  • 当存在自定义规则时,不再使用隐式规则。

二、典型隐式规则情况

1. makefile中出现同名目标

  • 命令
    当多处出现同一目标的命令时,make 发出警告。
    所有之前定义的命令被最后定义的命令取代。
  • 依赖
    将所有的依赖合并在一起,成为目标的最终依赖。

示例:

.PHONY : all
all :         # 有 2 个 同名的目标
  @echo "command -1"  
VAR := test
all :
  @echo "all : $(VAR)"

注意:

当使用 include 关键字包含其他文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖。

2. 当 makefile 中未定义相关规则时,会尝试使用隐式规则。

示例:

下面的代码可以编译成功吗?答案是 当然可以。

虽然 代码中没有 gcc -c -o $(OBJS) $(SRC ) , 但是 会使用 隐式规则

隐式规则 可能使用 make 中的预定义变量。

SRC := $(wildcard *.c)
OBJS := $(SRC:c=o)
hello.out : $(OBJS)
  gcc -o $@ $^
  @echo "Target ==> $@"
.PHONY : clean
clean : 
  $(RM) *.o  *.out

3. 当 make 发现目标的依赖不存在时。

  • 尝试通过 依赖名 逐一查找隐式规则。
  • 并且通过 依赖名 推导可能需要的源文件。

三、查看隐式规则

  1. 查看所有 : make -p

  2. 查看具体规则: make -p | grep “xxx”
    .o 文件的 生成 依赖于 .c .cc 等等。

四、隐式规则的禁用

  1. 局部禁用
  • 在 makefile 中 自定义规则。
  • 在 makefile 中定义模式。( 如:%.o : %.p )

示例:

  1. 全局禁用
  • make -r

五、隐式规则的副作用

  • 编译行为难以控制
    大量使用隐式规则可能产生意想不到编译行为
  • 编译效率低下
    make 从隐式规则和自定义规则中选择最终使用的规则。
  • 隐式规则链
    当依赖的目标不存在时, make 会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为!

在 实际工程 中 尽量不要使用 隐式规则。

例:

需要名为 A.o 的目标: N.y -> N.c ->N.o。

总结

下一篇介绍 make 的路径搜索。

相关文章
|
7月前
|
Shell
Makefile函数的使用(1)
Makefile函数的使用(1)
41 0
|
7月前
|
算法 开发者
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
194 0
|
7月前
|
Linux C语言
make:***没有指明目标并且找不到makefile。停止。
make:***没有指明目标并且找不到makefile。停止。
900 0
|
7月前
Makefile中.PHONY的含义
Makefile中.PHONY的含义
1071 0
|
7月前
Makefile中.SUFFIXES的含义
Makefile中.SUFFIXES的含义
191 0
Makefile基础教程(make的隐式规则)
Makefile基础教程(make的隐式规则)
122 0
|
小程序 C语言
玩转Makefile | 一次编译多个目标
玩转Makefile | 一次编译多个目标
574 0
玩转Makefile | 一次编译多个目标
|
vr&ar Shell
从头开始写项目Makefile(十):make内嵌函数及make命令显示【转】
转自:http://blog.csdn.net/shallnet/article/details/38314473#comments 版权声明:本文为博主原创文章,未经博主允许不得转载。如果您觉得文章对您有用,请点击文章下面“顶”。
1202 0
makefile详解 嵌套执行make,定义命令包
嵌套执行make 在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而不至于把所有的东西全部写在一个Makefile中,这样会很难维护我们的Makefile,这个技术对于我们模块编译和分段编译有着非常大的好处。
1551 0

热门文章

最新文章