Makefile 简介
一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作(因为makefile就像一个shell脚本一样,可以执行操作系统的命令)。
makefile带来的好处就是——“自动化编译”,一但写好,只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。make是一个命令工具,是一个及时makefile中命令的工具程序。
make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
Makefile规则
我们以多个文件来示例。
// prog.c
#include <stdio.h>
#include "code.h"
int main(void)
{
int i = 1;
printf ("myfun(i) = %d\n", myfun(i));
}
// code.c
#include "code.h"
int myfun(int in)
{
return in + 1;
}
// code.h
extern int myfun(int);
Make的规则是:
test(目标文件): prog.o code.o(依赖文件列表)
tab(一个tab来隔开) gcc prog.o code.o -o test(命令)
然后我们生成Makefile文件。
test: prog.o code.o
gcc prog.o code.o -o test
prog.o: prog.c code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o test
使用make命令执行Makefile。
make
gcc prog.o code.o -o test
gcc -c code.c -o code.o
gcc prog.o code.o -o test
./test
//清除.o和test文件
make clean
使用宏
Makefile还可以定义和使用宏(也称做变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为:
macroname = macrotext
使用宏的格式为:
$(macroname)
上面的Makefile改为使用宏
OBJS = prog.o code.o
CC = gcc
test: $(OBJS)
$(CC) $(OBJS) -o test
prog.o: prog.c code.h
$(CC) -c prog.c -o prog.o
code.o: code.c code.h
$(CC) -c code.c -o code.o
clean:
rm -f *.o test