一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。
例:(来自《鸟哥的Linux私房菜:基础学习篇(第三版)》
有4个 .c 的源文件,分别是 main.c,haha.c,sin_value.c,cos_value.c,其中 main 函数先读入 name 和 angle,再调用 haha 输出名字,调用 sin_value和 cos_value输出计算后的 sin 和 cos 值。
源码如下:
(1)main.c
#include <stdio.h>
#define pi 3.14159
char name[15];
float angle;
int main(void)
{
printf ("\n\nPlease input your name: ");
scanf ("%s", &name );
printf ("\nPlease enter the degree angle (ex> 90): " );
scanf ("%f", &angle );
haha( name );
sin_value( angle );
cos_value( angle );
}
(2)haha.c
#include <stdio.h>
int haha(char name[15])
{
printf ("\n\nHi, Dear %s, nice to meet you.", name);
}
(3)sin_value.c
#include <stdio.h>
#define pi 3.14159
float angle;
void sin_value(void)
{
float value;
value = sin ( angle / 180. * pi );
printf ("\nThe Sin is: %5.2f\n",value);
}
(4)cos_value.c
#include <stdio.h>
#define pi 3.14159
float angle;
void cos_value(void)
{
float value;
value = cos ( angle / 180. * pi );
printf ("The Cos is: %5.2f\n",value);
}
(5)makefile
main : main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean :
rm -f main main.o haha.o sin_value.o cos_value.o
makefile 带来的好处就是“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的make。
可见,makefile 都成为了一种在工程方面的编译方法。
通过 makefile,我们告诉 make 命令如何编译和链接多个源文件。规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接;
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序;
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要 makefile 写得好,所有的这一切,我们只用一个 make 命令就可以完成。make 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
makefile文件格式:
目标 : 目标文件1 目标文件2 ...
<tab> 命令1
<tab> 命令2
...
...
举个例子:
all : A B
A : A.o
g++ -o A A.o
B : B.o
g++ -o B B.o
A.o : A.cpp AA.h
g++ -c A.cpp AA.h
B.o : B.cpp BB.h
g++ -c B.cpp BB.h
clean :
rm *.o
rm *.gch
rm A
rm B
在这个例子中,使用 make all 命令可以一次性生成 A 和 B 两个可执行文件;而使用 make A 或 make B 这只生成A或B中的一个。
另外,clean 只是一个动作,使用 make clean 命令可以清除所有的 .o,.gch 文件,和 A、B 两个可执行文件。
参考: