2.makefile 结构

  • makefile 的意义

    • makefile 用于定义源文件间的依赖关系
    • makefile 说明如何编译各个源文件并生成可执行文件
  • 依赖的定义

    targets:prerequisites;command1
    '\t' command2
    
  • makefile 中的元素含义

    • targets

      • 通常是需要生成的目标文件名
      • make 所需执行的命令名称
    • prerequisities

      • 当前目标所依赖的其它目标或文件
    • command

      • 完成目标所需要执行的命令
  • 注意事项

    • targets 可以包含多个目标

      • 使用空格对多个目标名进行分隔
    • prerequisites 可以包含多个依赖

      • 使用空格对多个依赖进行分隔
    • [Tab] 键:\t

      • 每一个命令行必须以 [Tab] 字符开始
      • [Tab] 字符告诉 make 此行是一个命令行
    • 续行符:\

      • 可以将内容分开写到下一行,提高可读性
    • makefile 中可以在命令前加上 @ ,使得命令无回显

  • 依赖示例

    all:test
    	echo "make all"
    test:
    	echo "make test"
    
  • 依赖规则

    • 当目标对应的文件不存在,执行对应命令
    • 当依赖在时间上比目标更新,执行对应命令
    • 当依赖关系连续发生时,对比依赖链上的每一个目标
  • 示例:利用 main.c 和 func.c 源文件生成 hello.out 可执行文件

    • 源代码文件

      //func.c
      #include <stdio.h>
      void foo(){
          printf("print void foo()");
      }
      
      //main.c
      #include <stdio.h>
      extern void foo();
      
      int main()
      {
          foo();
          return 0;
      }
      
    • makefile 文件

      hello.out:main.o func.o
      	gcc -o hello.out main.o func.o
      main.o:main.c
      	gcc -o main.o -c main.c
      func.o:func.c
      	gcc -o func.o -c func.c
      
    • 执行 make,输出:

      gcc -o func.o -c func.c
      gcc -o main.o -c main.c
      gcc -o hello.out func.o main.o
      
    • 修改 func.c 文件 => 当依赖在时间上比目标更新,执行对应命令

      //func.c
      #include <stdio.h>
      void foo(){
          printf("print void foo()\n");
      }
      
      • 再次执行 make,输出:

        gcc -o func.o -c func.c
        gcc -o hello.out func.o main.o
        
posted @ 2020-06-27 11:19  nxgy  阅读(114)  评论(0编辑  收藏  举报