Makefile根基

IDE过程: 预处理(宏 头文件展开) —> 编译(编为汇编代码) —> 汇编(将汇编代码转换为机器码) —>链接.

makefile是一种脚本语言

第一层:显示规则
  1. #代表注释
  2. 目标文件:依赖文件
      [TAB]指令
 hello.i:hello.c 
   gcc -E hello.c -o hello.i


gcc编译过程:

hello.i:hello.c
  gcc -E hello.c -o hell.i	#预编译
  
hello.S:hello.i
  gcc -S hello.i -o hello.S	#汇编
  
hello.o:hello.S
  gcc -c hello.S -o hello.o	#编译
  
hello:hell.o
  gcc hell.o -o hello	#链接
  1. 第一个目标文件是我们最终目标!!!! 递归生成
  2. 伪目标:.PHONY

简单的Makefile例(hello.c):

hello:hello.o	#递归依赖生成hello,hello是最终生成目标
  gcc hello.o -o hell
  
hello.o:hello.S
  gcc -c hello.S -o hello.o
  
hello.S:hello.i
  gcc -S hello.i -o hello.S
  
hello.i:hello.c
   gcc -E hello.c -o hello.i
   
.PHONY:	#固定格式,伪目标
clear:
  rm -rf hello.o hello.S hello.i hello

第二层:变量

  1. 变量
  2. =    —> 替换
       TAR = hello —>后面的TAR都是hello
  3. +=    —>追加
       TAR += hell1    —>TAR就是hello跟hello1
  4. :=    —>恒等于
       CC := gcc    —>CC就是gcc

Makefile例(circle.c circle.h main.c main.h):

test: circle.o main.o
  gcc circle.o main.o -o test
  
circle.o: circle.c	#不用添加circle.h 已自动包含
  gcc -c circle.c -o circle.o
  
main.o: main.c	#不用添加main.h 已自动包含
  gcc -c main.c -o main.o
  
.PHONY:
clear:
  rm -f circle.o main.o test

使用第二层功力后:

TAR = test
OBJ = circle.o main.o
CC := gcc

$(TAR): $(OBJ)
  $(CC) $(OBJ) -o TAR
  
circle.o: circle.c	#不用添加circle.h 已自动包含
  $(CC) -c circle.c -o circle.o
  
main.o: main.c		#不用添加main.h 已自动包含
  $(CC) -c main.c -o main.o
  
.PHONY:
clear:
  rm -f $(OBJ) test

第三层:隐含规则

  1. %.c    —>任意的.c 文件
  2. %.o    —>任意的.o文件
  3. *.c    —>所有的 .c文件
  4. *.o    —>所有的 .o文件

使用三层功力后:

TAR = test
OBJ = circle.o main.o
CC := gcc

$(TAR): $(OBJ)
  $(CC) $(OBJ) -o TAR

%.o : %.c	#任意的 .c 文件皆可生成任意测 .o 文件
  $(CC) -c %.c -o %.c
.PHONY:
clear:
  rm -f $(OBJ)

第四层: 通配符

  1. $^    —>所有的依赖文件
  2. $@   —>所有的目标文件
  3. $<    —>所有 依赖文件的第一个文件

使用第四层功力后:

TAR = test
OBJ = circle.o main.o
CC := gcc

$(TAR): $(OBJ)
  $(CC) $^ -o $@
  
%.o : %.c #任意的 .c 文件皆可生成任意测 .o 文件
  $(CC) -c $@ -o $^
  
.PHONY:
clear:
  rm -f $(OBJ)

第五层: 函数

葵花宝典

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值