zoukankan      html  css  js  c++  java
  • makefile简析与例子

    Makefile:在标准的编译过程中,源文件先被编译成目标文件,再由目标文件连接成可执行文件

    1,基本格式:

      target(目标文件):依赖文件 命令

    例子:

     

     test:test.o add.o sub.o
    
      gcc test.o add.o sub.o -o test
    
      test.o:test.c
      gcc -c test.c
      add.o:add.c
      gcc -c add.c
      sub.o:sub.c
      gcc -c sub.c

     

    2,自定义变量:

      定义: 变量名=变量值

      引用变量: $(变量名) 或者${变量名}

      makefile的变量名:(1)以数字开头,(2)敏感大小写,(3)变量一般都在makefile的头部定义

    例子:

      

    #变量
    
      OBJS=add.o sub.o  test.o
      TARGET=test
    
      $(TARGET):$(OBJS)
      gcc $(OBJS) -o $(TARGET)
    
      add.o:add.c
      gcc -c add.c -o add.o
    
      sub.o:sub.c
    
      gcc -c sub.c -o sub.o
    
      test.o:test.c
    
      gcc -c test.c -o test.o
    
      clean:
    
        rm -fr $(OBJS) $(TARGET)

    3,自动变量

      $@:表示规则中的目标

      $<:表示规则中的第一个条件

      $^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项

    例子:

      

    #变量
    
      OBJS=add.o sub.o mul.o div.o test.o add.o
      TARGET=test
      CC=gcc
    
      #$@: 表示目标
      #$<: 表示第一个依赖
      #$^: 表示所有的依赖
    
      $(TARGET):$(OBJS)
      #$(CC) $(OBJS) -o $(TARGET)
      $(CC) $^ -o $@
      echo $@
      echo $<
      echo $^
    
      add.o:add.c
      $(CC) -c $< -o $@
    
      sub.o:sub.c
      $(CC) -c $< -o $@
    
      mul.o:mul.c
      $(CC) -c $< -o $@
    
      div.o:div.c
      $(CC) -c $< -o $@
    
      test.o:test.c
      $(CC) -c $< -o $@
    
      clean:
      rm -rf $(OBJS) $(TARGET)

    4,模式规则

      

    %.o:%.c
    
      $(CC)-c $(CFLAGS) $(CPPFLAGS) $< -o
    
    例子:
    
      OBJS=test.o add.o sub.o mul.o div.o
    
      TARGET=test
      $(TARGET):$(OBJS)
      gcc $(OBJS) -o $(TARGET)
    
     
    
      %.o:%.c
      gcc -c $< -o $@

    5, Makefile中的函数

    makefile中的函数有很多,介绍两个最常用的。

    1. wildcard – 查找指定目录下的指定类型的文件

      src = $(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src

    2. patsubst – 匹配替换

      obj = $(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o

    在makefile中所有的函数都是有返回值的。 

    例子:
    SRC=$(wildcard *.c)
    OBJS=$(patsubst %.c, %.o, $(SRC))
    TARGET=test
    $(TARGET):$(OBJS)
        gcc $(OBJS) -o $(TARGET) 
    ​
    %.o:%.c
        gcc -c $< -o $@ 

    6. Makefile中的伪目标

    clean用途: 清除编译生成的中间.o文件和最终目标文件

     

    make clean 如果当前目录下有同名clean文件,则不执行clean对应的命令

     

    Ø 伪目标声明: .PHONY:clean

     

    ​ 声明目标为伪目标之后,makefile将不会该目标是否存在或者该目标是否需要更新

    clean命令中的特殊符号:

    • “-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”

    • “@”不显示命令本身,只显示结果。如:“@echo clean done”

    例子:
    SRC=$(wildcard *.c)
    OBJS=$(patsubst %.c, %.o, $(SRC))
    TARGET=test
    $(TARGET):$(OBJS)
        gcc $(OBJS) -o $(TARGET) 
    ​
    %.o:%.c
        gcc -c $< -o $@
    .PHONY:clean
    clean:
        rm -rf $(OBJS) $(TARGET

    总结:1,分析各个目标和依赖之间的关系

      2,根据依赖关系自底向上执行命令  

  • 相关阅读:
    无法打开内核设备"\.Globalvmx86": 系统找不到指定的文件问题记录
    docker使用switch to Linux Containers切换不成windows问题
    js设计模式——发布订阅模式
    剑指offer系列——求1+2+…+n
    【转载】CSS3弹性盒布局方式
    【转载】.btc勒索病毒删除+还原文件(Dharma家族新成员)
    【转载】chrome浏览器的跨域设置——包括版本49前后两种设置
    【转载】SVN使用教程总结
    【转载】vue.js移动端app
    【转载】将web项目打包成手机app的方法
  • 原文地址:https://www.cnblogs.com/kony9527/p/10385471.html
Copyright © 2011-2022 走看看