刚刚开始学习makefile,下面我将演示一个makefile实例,五个.c执行文件,一个.h头文件。

makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具。


无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。


一、Makefile的规则

在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target ... : prerequisites ...
command
...
...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。(任意的Shell命令)


二、一个示例

建立lee文件夹,

显示lee文件夹里面的文件

自己不会,自己先写了一个make命令:

五个.c文件内容为:

add.c

div.c

dec.c

mul.c

main.c

main.h

main.h将dev(int,int)改为dec(int,int).函数写错了

创建一个makefile文件

vim makefile

文件内容为:

//**************************************

program:main.o add.o dec.o mul.o div.o
    gcc main.o add.o dec.o mul.o div.o -o program
main.o:main.c main.h
    gcc -c main.c -o main.o
add.o:add.c
    gcc -c add.c -o add.o
dec.o:dec.c
    gcc -c dec.c -o dec.o
mul.o:mul.c
    gcc -c mul.c -o mul.o
div.o:div.c
    gcc -c div.c -o div.o
clean:
    rm * .o program

//****************************************

在该目录下直接输入make命令,就可以生成执行文件program。

输入make命令后弹出提示:

在make命令后出现这种错误提示,是提示第2行没有分隔符。

例如:

1 target:prerequisites

2 command

改为:

1 target:prerequisites

2     command

重新把所有的开头Tab了一遍:

又出错了:

我找错找了半天终于发现问题所在了!大家编译C代码千万不要在vim模式下编辑,换成gedit。

找错找了半天,发现错误如下所示:

看到最后一个~了吗!!!!问题出在这里,按空格的时候把~也按进去了,辛辛苦苦的查代码错误没有一个错误的语法,原来是是这个小地方!!!!

然后重新make一下,就正常显示啦:

make成功了!

看一下文件夹里面的文件:

运行一下,代码运行结果如下所示:


clean program:

program没有了。


参考文献资料:http://blog.chinaunix.net/uid-20760826-id-1872305.html