• Makefile (3) 基本语法和使用


    make是用来管理一个工程项目的工具 .

    Makefile就是这个项目文件 .

    1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 :

      #规则
      targets: prerequisites
          command
    
     #举例 main.c func1.c
      hello: main.o func1.o
          gcc main.o func1.o -o hello
          
      main.o: main.c
          gcc -c main.c
      func1.o: func1.c
          gcc -c func1.c

     

    2.makefile的时间戳

      对于已经编译过一次的工程,如果没有对源文件进行修改,目标文件是不会重复编译的,这样编译效率比较高.

      也就是说,如果目标文件和依赖文件的时间戳是一样的,就不会重新编译,

      如果目标文件的时间戳比依赖文件的时间戳旧,就会重新编译.

     

    3.伪目标

      对于工程的清理, 需要写一个clean功能,这种类似的功能, 不需要依赖文件,这种命令 称作 伪目标.

     #伪目标 
      # .PHONY: xxx .PHONY: clean
      clean:
          rm -rf *.o hello
          
      .PHONY: install
      install:
          cp hello /usr/bin
          
      .PHONY: uninstall
      uninstall:
          rm /usr/bin/hello

     

    4.makefile 的变量

      1.用户自定义变量
      2.预定义变量
      3.自动变量
      #用户自定义变量 --
      OBJ = main.o func1.o ...
      hello : $(OBJ)
          gcc $(OBJ) -o hello
          
      #预定义变量
      AR --> ar
      CC --> 编译器
      ARFLAGS --> 库编译选项
      CFLAGS --> C编译器选项
          #举例 CFLAGS = -g -c
          gcc $(CFLAGS) func.c
          
      #自动变量
      $* --> 不包含扩展名的目标文件名称 #main.o : main.c   $* 表示main.o 中的main
      $< --> 表示第一个依赖文件的名称
      $? --> 所有时间戳比目标文件晚的依赖文件
      $@ --> 目标文件的完成名称
      $^ --> 所有不重复的依赖文件
          # hello : main.o func1.o
          #   $(CC) $^ -o $@
     

    5.makefile 条件判断

      #条件判断不能用tab 打头
      hello: main.o func1.o
      ifeq ($(CC),gcc)
          gcc $^ -o $@
      else
          $(CC) $^ -o $@
      endif

    6.Makefile的嵌套和引用

      一个工程是由一层一层Makefile的嵌套组成的 .每个Makefile文件负责管理不同的部分,然后通过嵌套和引用,来管理整个工程的源码 .

      #包含
      include proc/makefile
      ​
      #嵌套
      subsystem:
      $(MAKE) -C subdir

    7.makefile 管理命令

    -C dir执行指定文件夹下面的makefile
    -f file 读入当前文件夹下的file 为 Makefile
    -i 忽略所有命令执行的错误
    -I dir 指定被包含(include)的Makefile 的路径
      -C 用于迭代,
      /-
       |-Makefile
       |-srcA
       |  |-xx.c
       |  |-Makefile
       |
       |-srcB
          |-xx.c
          |-Makefile
          
      #在根目录下的Makefile
          $(MAKE) -C srcA
          $(MAKE) -C srcB

    8.用伪目标生成多个文件

     .PHONY: all
      all: tar1 tar2 tar3
       
      tar1: tar1.o
          $(CC) $^ -o $@
      ​
      tar2: tar2.o
          $(CC) $^ -o $@
          
      tar3: tar3.o
          $(CC) $^ -o $@

     

     

     

  • 相关阅读:
    1834. 单线程 CPU sort+优先队列 过了,学习vector<vector<int>>排序
    552. 学生出勤记录 II 力扣(困难) 记忆化搜索/dp 不会做,学习记忆化搜索转dp的学习
    526. 优美的排列 力扣(中等) dfs暴搜/ 状压dp是没想到的
    576. 出界的路径数 力扣(中等) 路径dp/记忆化搜索 都不会做
    1583. 统计不开心的朋友 力扣(中等) 模拟,思考一下
    233. 数字 1 的个数 力扣(困难) 数位dp/数学 不会做
    516. 最长回文子序列 力扣(中等) 区间dp,不会做
    446. 等差数列划分 II
    7.14 数据结构板子
    7.13 树上问题
  • 原文地址:https://www.cnblogs.com/kmist/p/10201637.html
Copyright © 2020-2023  润新知