一、概述
在学习linux时,相信makefile是必须掌握的内容之一,因为学习Linux的过程中离不开敲代码,如果每一个文件都需要一一的gcc,那效率就太慢了,所以makefile就是加快效率的好帮手,写一次makefile省略千千万万次手动gcc。
二、应用场景一
相同目录下模块化程序文件的编译。
1.编译过程如下图所示
2.makefile代码如下
1 src=$(wildcard *.c) #把所有的.c文件放在src变量中
2 obj=$(patsubst %.c,%.o,$(src)) #把src中的.c文件替换成.o文件
3
4 message=-Wall -g #编译时打印出警告信息 编译完成后的文件可以进行gdb调试
5
6 ALL:main #指定终极目标
7
8 main:$(obj)
9 gcc $^ -o $@ $(message) #相当于 gcc hello.c -o hello
10
11 $(obj):%.o:%.c
12 gcc -c $< -o $@ $(message) #相当于 gcc -c hello.c -o hello.o
13
14 clean:
15 -rm -rf $(obj) main #执行该命令时会删去 .o和可执行文件main
16
17 .PHONY:clean ALL #防止目录中有文件名与之重复时编译不成功
三、应用场景二
头文件和 .c文件 .o文件不在同一目录下的情况
1.编译过程如下图所示
2.makefile代码如下
1 src=$(wildcard ./inr/*.c) #把所有的.c文件放在src变量中
2 obj=$(patsubst ./inr/%.c, ./ino/%.o, $(src)) #把src中的.c文件替换成.o文件
3
4 path=./include
5 message=-Wall -g #编译时打印出警告信息 编译完成后的文件可以进行gdb调试
6
7 ALL:main #指定终极目标
8
9 main:$(obj)
10 gcc $^ -o $@ $(message) #相当于 gcc hello.c -o hello
11
12 $(obj):./ino/%.o:./inr/%.c
13 gcc -c $< -o $@ $(message) -I $(path) #相当于 gcc -c hello.c -o hello.o
14
15 clean:
16 -rm -rf $(obj) main #执行该命令时会删去 .o和可执行文件main
17
18 .PHONY:clean ALL #防止目录中有文件名与之重复时编译不成功
四、应用场景三
相同目录下 多个.c编译
1.编译过程如下
2.makefile代码如下所示
1 src=$(wildcard *.c) #把所有的.c文件放在src变量中
2 obj=$(patsubst %.c, %, $(src)) #把src中的.c文件替换成可执行文件
3
4 ALL:$(obj) #指定终极目标
5
6 %:%.c
7 gcc $< -o $@ #相当于 gcc hello.c -o hello
8
9 clean:
10 -rm -rf $(obj)
11
12 .PHONY:clean ALL #防止目录中有文件名与之重复时编译不成功
以上就是我总结的makefile简单的应用,更深入的层次可自行查阅makefile相关的书籍