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,根据依赖关系自底向上执行命令  

原文地址:https://www.cnblogs.com/kony9527/p/10385471.html