• 第16课


    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
    ");
    }

    运行结果:

      

    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.小结

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

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

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

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

  • 相关阅读:
    code of C/C++(2)
    code of C/C++ (1)
    dll 的编写和使用
    Python基础练习-数据类型与变量part2
    Python基础练习-数据类型与变量
    python基础练习-循环
    Linux grep
    nginx反向代理
    正则表达式
    Linux samba ing
  • 原文地址:https://www.cnblogs.com/hoiday/p/9265751.html
Copyright © 2020-2023  润新知