第16课 - make的隐式规则(下)

1. 深入理解隐式规则

 

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

1) 尝试通过依赖名逐一查找隐式规则

2) 并且通过依赖名推导可能需要的源文件

     
    

 

 

2. 隐式规则的副作用

  • 编译行为难以控制:大量使用隐式规则可能产生意想不到的编译行为

  • 编译效率低下:make从隐式规则和自定义规则中选择最终使用的规则,编译效率低

 

3.隐式规则链

  当依赖的目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为。

    

 

 

4. 查看隐式规则

查看所有

  make -p 


查看具体规则

  make - p |  grep xxx

 

make -p | grep "%.o"

  

 

 

 

编程实验:深入隐式规则 makefile.1

func.p

unit Func;

interface

procedure Greeting(); attribute (name = 'greeting');

implementation

procedure Greeting();
begin
  WriteLn('Hello, Pascal!');
end;


end.

 

 

main.c

#include <stdio.h>

extern void greeting();

int main()
{
    greeting();
    
    return 0;
}    

 

 

makefile.1

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

 

运行结果:

  

 

 

 

 

增加func.c:

func.c

#include "stdio.h"

void greeting()
{
    printf("greeting\n");
}

 

运行结果:

  

 

 

 

 

5. 隐式规则的禁用

  • 局部禁用:

    1)在makefile中自定义规则

    2)在makefile中定义模式(如: %.o : %.p

  • 全局禁用:

    make -r

 

6. 后缀规则简介

  • 后缀规则时旧式的模式规则

  • 可以通过后缀描述的方式自定义规则 

      
  • 双后缀规则:定义一对文件后缀(依赖文件后缀和目标文件后缀)
      
  • 单后缀规则:定义单个文件后缀(源文件后缀)
       
     

7.后缀规则注意事项

  • 后缀规则不允许有依赖

  • 后缀规则必须有命令,否则无意义

  • 后缀规则将逐步被模式规则取代

编程实验:后缀规则初体验 makefile.2

app.out : main func.o

     $(CC) -lstdc++ -o $@ $^


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

 

 

运行结果:

  

 

 

 

8.小结

  • 隐式规则可能造成意想不到的编译行为

  • 在实际工程项目中尽量不使用隐式规则

  • 后缀规则是一种旧式的模式规则

  • 后缀规则正逐步被模式规则取代

posted @ 2018-09-06 00:01  梦心之魂  阅读(213)  评论(0编辑  收藏  举报