Makefile基础知识

1、Makefile

  • 是一个工程管理文件,能够完成程序的自动化编译
  • 需要使用make工具,对Makefile文件进行读取
  • Makefile可以了解程序的执行和编译过程,提高工作效率

1.1 工作过程

  • 把代码的运行分为两步
    1. 生成二进制文件,节约编译时间
    2. 链接生成可执行文件,保证中间文件,已经执行完编译中大部分操作
  • Makefile会根据文件的时间戳判断文件是否更新
  • make工具会默认读入名为makefile的工程文件,如果makefileMakefile优先读入makefile
  • 指定make读入文件make -f 文件名

1.2 语法

  • Makefile由规则、变量、函数和条件编译构成

  •   一条规则的构成:
      目标:依赖
      	指令
    
  • 规则必须有一个目标

  • 一条规则可以没有依赖,只执行某些指令

  • 一条规则可以不执行指令,只说明依赖关系

  • 一个目标可以有多个依赖

all:fun
#all:fun
fun:main.o fun.o
	gcc main.o fun.o -o fun

main.o:main.c fun.h
	gcc -c main.c -o main.o

fun.o:fun.c fun.h
	gcc -c fun.c -o fun.o

clean:
	rm *.o fun

1.3 make工具的使用

  • make 参数 目标
  • 如果不加目标,make默认去执行文件中的第一个目标
  • all可以指定一个目标优先执行,所以all一般依赖于可执行文件

1.4 变量引入

  • Makefile中的变量赋值方式

    1. =:递归赋值取最后一次的值
    2. +=:追加赋值在原值后面+空格+数值
    3. :=:立即赋值在哪里赋值,就在哪里替换
    4. ?=:条件赋值判断变量前面是否定义,没定义就赋值,定义过就跳过
#OBJs是记录.o文件的变量
OBJs+=fun.o
OBJs+=main.o

#EXE是记录可执行文件的变量
EXE=fun

#CC是Makefile提供的自动变量,自动匹配程序所需的编译器
CC=gcc

#CFLAGS是记录编译参数的变量,也是Makefile提供的自动变量
CFLAGS=-c -o


all:$(EXE)

$(EXE):$(OBJs)
	$(CC) $(OBJs) -o $(EXE)

main.o:main.c
	$(CC) $(CFLAGS) main.o main.c

fun.o:fun.c
	$(CC) $(CFLAGS) fun.o fun.c

clean:
	rm *.o $(EXE)

1.5 引入自动变量和通配符

  • 自动变量

    • $@:所有目标
    • $^:所有依赖
    • $#:第一个依赖
  • 通配符

    • *****:通配所有文件
    • %:模式匹配
      • 应用%.o:%.c
      • 先拿到fun.o
      • 进行模式匹配,%.o和fun.o匹配,得到**%**是fun
      • 继续匹配,匹配到**.c的部分,%.c**就等于fun.c
#OBJs是记录.o文件的变量
OBJs+=fun.o
OBJs+=main.o

#EXE是记录可执行文件的变量
EXE=fun

#CC是Makefile提供的自动变量,自动匹配程序所需的编译器
CC=gcc

#CFLAGS是记录编译参数的变量,也是Makefile提供的自动变量
CFLAGS=-c -o


all:$(EXE)

$(EXE):$(OBJs)
	$(CC) $(OBJs) -o $(EXE)

%.o:%.c
	$(CC) $(CFLAGS) $@ $^

clean:
	rm *.o $(EXE)

1.6 引入函数

  • 内置函数
    • 要求:Makefile中需要的文件必须在同一路径下,并且该路径下不允许有其他文件
  • wildcard
    • 使用wildcard获取,文件中的所有**.c**文件
    • $(wildcard 指定的文件格式) 获取当前目录下,所有指定格式的文件
  • patsubst
    • 模式匹配
    • $(patsubst 模式1,模式2,要转换的字符串)
    • $(patasubst %c,%o,$(wildcard))
#OBJs是记录.o文件的变量
files=$(wildcard *.c)
OBJs=$(patsubst %c,%o,$(files))

#EXE是记录可执行文件的变量
EXE=fun

#CC是Makefile提供的自动变量,自动匹配程序所需的编译器
CC=gcc

#CFLAGS是记录编译参数的变量,也是Makefile提供的自动变量
CFLAGS=-c -o


all:$(EXE)

$(EXE):$(OBJs)
	$(CC) $^ -o $@

%.o:%.c
	$(CC) $(CFLAGS) $@ $^

clean:
	rm *.o $(EXE)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值