一、makefile概述

makefile可以对整个工程项目文件进行管理,进行自动化编译,一旦写好只需要一个 make 命令,整个工
程完全自动编译。 

二、makefile基本原则

基本规则中的三要素: 目标, 依赖, 命令
目标:依赖条件
           命令(此行为一个TAB缩进)
规则示例:
mycalc:add.c sub.c mul.c div.c
      gcc add.c sub.c mul.c div.c -o mycalc(此行为一个TAB缩进)

三、makefile语法

1.变量的定义:
obj=main.o add.o sub.o mul.o(变量的定义)
target=app(变量的定义)

#递归展开式
#延时变量,可以引用还没有定义的变量,展开是引用时展开,即值使用到时才确定
str2=$(str1)
str1=hello

#直接展开式
#即时变量,必须引用定义好了的变量,定义之后就会展开,即值即刻确定,在定义时即确定
str3 := android
str4 := $(str3)
str5 := $(str1) world

#变量的值追加,它是即时变量还是延时变量取决于前面的定义
str5 += hello

2.自动化变量
  2.1 $<: 规则中的第一个依赖
  2.2 $^: 规则中的所有依赖
  2. 3 $@: 规则中的目标
  只能在规则中的命令中使用

3. 模式匹配规则
  %.o:%.c
     gcc -c $< -o $@

4. 两个常用系统函数
   4.1  查找指定目录下, 指定类型的文件
     src=$(wildcard ~/aa/*.c)
   4.2  匹配替换函数
     obj=$(patsubst %.c, %.o, $(src))

5.自定义函数
myfun=$2 $1
#变量等于函数的执行结构
myfun_ret=$(call myfun,20,10)

四、makefile的三种写法(由简单到复杂)

第一种写法:
app:main.c add.c sub.c mul.c
      gcc main.c add.c sub.c mul.c -o app

第二种写法:
app:main.o add.o sub.o mul.o
       gcc main.o add.o sub.o mul.o -o app

main.o:main.c
      gcc -c main.c -o main.o

add.o:add.c
      gcc -c add.c -o add.o

mul.o:mul.c
      gcc -c mul.c -o mul.o

sub.o:sub.c
      gcc -c sub.c -o sub.o

第三种写法:

obj=main.o add.o sub.o mul.o
target=app
 #makefile中自己维护的变量(makefile代码里面的注释用#)
CC = gcc

$(target):$(obj)
     $(CC) $(obj) -o $(target)

%.o:%.c
       $(CC) -c $< -o $@

#clean清除所有的.o中间文件
#伪目标
.PHONY:clean
clean:
    rm -f *.o
    rm -f app

五、makefile的使用

1.写好makefile文件后使用make命令即可对整个工程项目进行编译链接。
2.用make clean 来显式调用makefile文件中的clean目标
3.makefile第一条规则是用来生成终极目标的规则

  • 如果规则中的依赖不存在, 向下寻找其他的规则
  • 更新机制: 比较的是目标文件和依赖文件的时间

六、makefile总结

1. 一个基本规则
  1.1 三要素: 目标, 依赖, 命令
  目标:依赖
          命令
  1. 2 第一条规则是用来生成终极目标的规则

  •     如果规则中的依赖不存在, 向下寻找其他的规则
  •     更新机制: 比较的是目标文件和依赖文件的时间

2. 两个函数
   2.1  查找指定目录下, 指定类型的文件
     src=$(wildcard ~/aa/*.c)
   2.2  匹配替换函数
     obj=$(patsubst %.c, %.o, $(src))

3. 三个自动变量
  3.1 $<: 规则中的第一个依赖
  3.2 $^: 规则中的所有依赖
  3. 3 $@: 规则中的目标
  只能在规则中的命令中使用

4. 模式规则
  %.o:%.c
     gcc -c $< -o $@