目录
Linux编程 Makefile(项目管理)
1 什么是 Makefile
- 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令。
- Makefile 带来的好处就是“自动化编译” ,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 Makefile 文件中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如 Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的 make。
2 Makefile 文件命名和规则
- 文件命名: makefile 或者 Makefile
- Makefile 规则
3 Makefile工作原理
◼ 命令在执行之前,需要先检查规则中的依赖是否存在
如果存在,执行命令
如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如果找到了,则执行该规则中的命令。
◼ 检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间。
如果依赖的时间比目标的时间晚,需要重新生成目标。
如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被执行。
例如:实现一个加减乘除的项目管理
app :sub.o add.o mult.o div.o main.o
gcc sub.o add.o div.o mult.o main.o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
div.o:div.c
gcc -c div.c -o div.o
mult.o:mult.c
gcc -c mult.c -o mult.o
main.o:main.c
gcc -c main.c -o main.o
生成app这个程序,需要先获得依赖sub.o add.o mult.o div.o main.o,如果没有就会找下面的命令生成这些依赖。
3 变量
app:main.c a.c b.c
gcc -c main.c a.c b.c
使用变量后:
app:main.c a.c b.c
$(CC) -c $^ -o $@
4 模式匹配
直接看例子吧!
未使用模式匹配前:
app :sub.o add.o mult.o div.o main.o
gcc sub.o add.o div.o mult.o main.o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
div.o:div.c
gcc -c div.c -o div.o
mult.o:mult.c
gcc -c mult.c -o mult.o
main.o:main.c
gcc -c main.c -o main.o
模式匹配后:
#定义变量
src=sub.o add.o mult.o div.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
%表示通配符,匹配一个字符串,在生成app前需要生成.o文件,每一次生成.o文件都要调用含有%.o:%.c生成.o文件。
5 函数
函数1:
$(wildcard *.c ./sub/*.c)
返回值格式: a.c b.c c.c d.c e.c f.c
$(patsubst %.c, %.o, x.c bar.c)
返回值格式: x.o bar.o
6 clean功能
.PHONY:clean
clean:
rm *.o -f
可以用来清除中间文件,比如我们有a.c,b.c,main.c先生成a.o,b.o,mian.o,再链接生成app,这个时候a.o,b.o,main.o就没有用了,我们可以在Makefile文件末尾添加上述代码执行rm指令用来删除中间文件。但是不是添加了这三行代码就可以删除,需要在shell中执行make clean来调用clean指令。
.PHONY:clean这一行的代码的作用是生成clean伪目标,不写这一行代码的话会生成名为clean的文件,如果已经有了clean文件就不会被更新,make clean的话就不会实现我们想要的功能。添加了本行代码的话,不用建立文件,实现clean功能。