系列文章目录
文章目录
前言
如果写的对你有点帮助的话,别忘了给我介绍,当然如果是小姐姐,可以自荐哦哈哈!
一、什么是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 的工作流程
以上例介绍
- 输入命令:make
- make会自动编译Makefile
- 会把main当作最终生成的文件
- 但是依赖 .o文件(main.o beep.o led.o usart.o)
- 然而 .o文件依赖 .c 文件
- 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文件