对于从事Unixc开发的人员来说,Makefile并不陌生,用make来开发和编译程序的确非常方便,但是要想写出一个完美的Makefile文档并不是想象的那么简单,因为往往一个软件的Makefile文档内容非常多,需要考虑到得方面也比较多,下面我用一些非常简单的例子来简要的说明一下通常Makefile的编写方法。
例如:现在已经编好了几个文档a.h  a.c  b.h  b.c  c.h  c.c  main.c
a.h
#ifndef A_H
#define A_H
void A();
#endif
a.c
#include<stdio.h>
void a()
{
   printf("This is the a!\n");
}
b.h
#ifndef B_H
#define B_H
void B();
#endif
b.c
#include<stdio.h>
void b()
{
    printf("This is the b!\n");
}
c.h
#ifndef C_H
#define C_H
void c();
#endif
c.c
#include<stdio.h>
void c()
{
   printf("This is the c!\n");
}
main.c
#include<stdio.h>
#include<a.h>
#include<b.h>
#include<c.h>
int main()
{
   a();
   b();
   c();
    return 0;
}
那么我们的makefile文档应该这样编写:
test: main.o a.o b.o c.o ç test为要生成文件名,”:”后面的是生成test所依赖的文件;
[tab]gcc main.o a.o b.o -o test
main.o: main.c
[tab]gcc -c main.c
a.o: a.c  a.h  ç生成a.o所依赖的文件是a.c a.h
[tab]gcc -c a.c
b.o: b.c  b.h
[tab]gcc -c b.c
c.o: c.c  c.h
[tab]gcc -c b.c
clean:
[tab]rm -rf  *o  test  ç执行clean命令时所执行的动作;
需要注意的是,命令之前必须有一个[tab]键的间隔,否则会报错。
比如把第三行行首的[tab]去掉则出现以下结果:
makefile:3: *** missing separator.  Stop.  ç提示第三行出错
以上工作完成之后,就可以通过执行make这一个命令来完成以上4个源文件的编译连接过程,这就是其方便之处。过程如下:
[root@localhost test]# ls
a.c  a.h  b.c  b.h  c.c  c.h  main.c  makefile ç执行make之前;
[root@localhost test]# make
gcc -c main.c -o main.o
gcc -c a.c -o a.o
gcc -c b.c -o b.o
gcc -c c.c -o c.o
gcc main.o a.o b.o c.o -o test
[root@localhost test]# ls
a.c  a.h  a.o  b.c  b.h  b.o  c.c  c.h  c.o  main.c  main.o  makefile  test ç执行之后;
经过上面的步骤,就生成一个可执行文件testmake命令自动读取文件makefile的内容,然后根据其内容的要求有步骤地编译makefile文件中涉及到的所有源程序,此时只需执行一次make命令就达到目的了,然后执行生成的test出现以下结果:
[root@localhost test]# ./test
This is the a!
This is the b!
This is the c!
也就是说,这个test命令执行一次相当于同时输出三个源程序a.c b.c c.c的结果,这更加显现出makefile文件的高效性。删除编译产生的文件也很方便,只需执行make clean命令就行了。
如:
[root@localhost test]# ls
a.c  a.h  a.o  b.c  b.h  b.o  c.c  c.h  c.o  main.c  main.o  makefile  test
[root@localhost test]# make clean
rm -fr *.o test
[root@localhost test]# ls
a.c  a.h  b.c  b.h  c.c  c.h  main.c  makefile
makefile文件用途非常广,在linux系统下,各种软件的源码包(*.tar,*.tar.gz ,*.tar.bz2)都包含有不同的makefile文件,在安装源码包时,主要步骤如下:
tar jxvf  test.tar.bz2
cd  test
./configure
make  ç 这个步骤是比不可少的;
make install
综上所述,Makefile文件在linux下的程序开发中是必不可少的,因为它的存在可以程序员减少相当大的工作量,所以学习Makefile文件的编写在程序开发中也是很重要的。以上所举得例子虽然都是比较简单的,有些内容还没有总结到,但是主要的步骤基本一样,大的程序中Makefile文件内容比较复杂,是因为其涉及的源程序比较多,其基本的组织结构都是非常相似的,需要平时多看,多积累才能很好的掌握Makefile的编写。