make能作为工程管理器,把不同的源文件进行编译链接到一个工程。make每次读取的都是Makefile,它也就是普通的文本文件,只是它有它自己的语法。make主要通过时间戳的原理来进行管理工程。比如main.c的文件总是会main.o的文件更旧,因为main.o是依赖于main.c而产生的。一旦出现main.c的文件比main.o时间还新,那说明main.c肯定是被更新了,这个时候make就会把该文件重新编译。
make能把工程实现模块化,一个大的工程也许包含了很多的源文件,每次完整编译的话会很浪费时间。程序员修改了一个模块的源文件,只需要把这个模块重新编译链接进到整个工程即可。效率很高,原理就是上面的时间戳比较。
下面是一些实例:
//main.c #include <stdio.h> void fun1(); void fun2(); int main() { fun1(); fun2(); return 0; }
//fun1.c #include <stdio.h> void fun1() { printf("\nHello from fun1\n"); }
//fun2.c #include <stdio.h> void fun2() { printf("Hello from fun2"); }
下面是编辑Makefile文件
[firefox@fire Make_Test]$ vim Makefile
#target : dependency_files # command main : main.o fun1.o fun2.o gcc -o main main.o fun1.o fun2.o main.o : main.c gcc -o main.o -c main.c fun1.o : fun1.c gcc -o fun1.o -c fun1.c fun2.o : fun2.c gcc -o fun2.o -c fun2.c
接着输入make,就会自动去读取Makefile文件,按照指定的语法进行执行。
[firefox@fire
Make_Test]$ make
gcc -o main.o -c main.c
gcc -o fun1.o -c fun1.c
gcc -o fun2.o -c fun2.c
gcc -o main main.o fun1.o fun2.o
要是更新了fun1.c,make就仅仅会重新编译fun1.c,然后重新链接所有.o文件。