我教你写Makefile,你给我介绍Girlfriends.

系列文章目录



前言

如果写的对你有点帮助的话,别忘了给我介绍,当然如果是小姐姐,可以自荐哦哈哈!


一、什么是Makefile?

怎么说也要走走流程,介绍一下吧! 一个工程里面会有很多文件夹,文件夹里会有很多 .c文件 .h文件,当我们编译时,不可能把所有源文件都写一遍,太费事了,所以Makefile可以实现自动化编译。当我们写出一个比较好的Makefile时,我们就可以make一下,编译整个工程。就相当于阿基米德撬动地球的支点。

本质:文件依赖性

在这里插入图片描述

二、Makefile 的规则

在这里插入图片描述

target :可以是一个 object file(目标文件),也可以是一个执行文件,还可以是一个标签( label)。
prerequisites: 生成该 target 所依赖的文件和/或 target
command: 该 target要执行的命令(任意的 shell 命令)

核心规则

如果prerequisites做了任意变化,target就要更新,就要执行一次command.
牢记
command 前面是个Tab,一定要有Tab.

本质文件依赖性

目标:依赖文件(我必须得到你才能变成自己想要的样子)
举例: main:led.c 要想变成main必须需要led.c
在这里插入图片描述

三、记住这个例子

main: main.o beep.o led.o usart.o    
	gcc main.o beep.o led.o usart.o -o main	
led.o:led.c
    gcc -c led.c -o led.o
usart.o:usart.c
    gcc -c usart.c -o usart.o
beep.o:beep.c
    gcc -c beep.c -o beep.o
main.o:main.c
	gcc -c main.c -o main.o
clean: 
	rm main.o beep.o led.o usart.o -rf

1.整个 make 的工作流程

以上例介绍

  1. 输入命令:make
  2. make会自动编译Makefile
  3. 会把main当作最终生成的文件
  4. 但是依赖 .o文件(main.o beep.o led.o usart.o)
  5. 然而 .o文件依赖 .c 文件
  6. make clean :清除所有的目标文件,以便重编译

强调:如果增加或减少或改变 .c .h文件,.o文件会被重新编译,当然也就会生成了个新的main.

2.Makefile 中特殊变量

%.c:相当于led.c beep.c usart.c 等等
%.o: 相当于led.o beep.o usart.o 等等
*.o: 相当于led.o beep.o usart.o 等等
$@ 目标文件
$^ 所有的依赖文件
$< 第一个依赖的文件

在这里插入图片描述

四、天火三玄变

1.第一变

main:main.o beep.o led.o usart.o    
	gcc $^ -o $@	
led.o:led.c
    gcc -c $< -o $@
usart.o:usart.c
    gcc -c $< -o $@
beep.o:beep.c
    gcc -c $< -o $@
main.o:main.c
	gcc -c $< -o $@
clean: 
	rm *.o -rf

$^ : 相当于main.o beep.o led.o usart.o
$@: 相当于main

看起来简单了一些,但是还可以再变。

2.第二变

main: *.o   
	gcc $^ -o $@	
%.o:%.c
	gcc -c $< -o $@
clean: 
	rm *.o -rf

这样还能看懂吗?需要认真看3.2里的内容哦!实在不懂请私信吧!但是真的很简单了。

3.第三变

危险提示:实力不济不要强行修炼。

3.1 修炼必备函数

1.函数调用用$符号
2. 函数的参数之间以 , 隔开。函数名字和参数之间用空格隔开
3.
在这里插入图片描述
4. 在这里插入图片描述
5 . 在这里插入图片描述
6 . 在这里插入图片描述
7 . 在这里插入图片描述
8 . 在这里插入图片描述
在这里插入图片描述

3.2 修炼入魔

如果继续添加.c文件呢?可不可以写成不管再添加多少.c文件,依然可以适用的Makefile呢?

OBJ := main                 
CFILE := $(wildcard ./*.c)  
OFILE := $(patsubst %.c,%.o,$(CFILE))  
$(OBJ) : $(OFILE)          
	gcc $^ -o $@
%.o : %.c                 
	gcc -c $< -o $@                        
clean:
	rm *.o -rf

解释一番吧!
第一行: 最终文件依然是main
第二行: 当前路径下所有.c文件给CFILE
第三行: 将CFILE里所有.c文件转换成.o文件给OFILE
第四行:main需要依赖所有.o文件
第六行: 所有.o文件需要依赖.c文件


总结

学废没有?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值