Linux编程——Makefile 使用

来源:互联网 发布:淘宝可靠的日本代购 编辑:程序博客网 时间:2024/06/01 08:27

    在先前的文章中,我们已经学习了 gcc 和 gdb 的使用。本节,我们将介绍 Makefile 的使用。Makefile带来的好处就是——“自动化编译”,一但写好,只需要一个 make 命令,整个工程便可以完全编译,极大的提高了软件的开发效率(特别是对于那些项目较大、文件较多的工程)。

    make是一个命令工具,最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。

    而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。

   下面从一个简单实例入手,介绍如何编写Makefile。假设现在有一个简单的项目由几个文件组成:prog.c、 code.c、 code.h。这些文件的内容如下:

    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);

    这些程序都比较短,结构也很清晰,因此使用下面的命令进行编译:

$ gcc -c code.c -o code.o$ gcc -c prog.c -o prog.o$ gcc prog.o code.o -o test
    如上所示,这样就能生成可执行文件test,由于程序比较简单,而且数量也比较少,因此看不出来有多麻烦。但是,试想如果不只上面的3个文件,而是几十个或者是成百上千个甚至更多,那将是非常复杂的问题。


    那么如何是好呢?这里就是makefile的绝佳舞台,下面是一个简单的makefile的例子。

    首先  $ vim Makefile 

test: prog.o code.o        gcc prog.o code.o -o testprog.o: prog.c code.h        gcc -c prog.c -o prog.ocode.o: code.c code.h        gcc -c code.c -o code.oclean:        rm -f *.o test

  有了这个Makefile,不论什么时候修改源文件,只要执行一下make命令,所有必要的重新编译将自动执行。make程序利用Makefile中的数据,生成并遍历以test为根节点的树;现在我们以上面的实例,来学习一下Makefile的一般写法: 

test(目标文件): prog.o code.o(依赖文件列表)tab(至少一个tab的位置) gcc prog.o code.o -o test(命令).......

  一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:一个目标,即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如‘clean’;一个或多个依赖文件的列表,通常是编译目标文件所需要的其他文件。之后的一系列命令,是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,并以tab开头(务必注意:是tab,而不是空格) 执行以上Makefile后就会自动化编译:

$ makegcc -c prog.c -o prog.ogcc -c code.c -o code.ogcc prog.o code.o -o test

  最后就会多产生: porg.o code.o test这三个文件,执行./test查看结果

  还记得Makefile中的clean吗?make clean就会去执行rm -f *.o test这条命令,完成 clean 操作。

  

  Makefile还可以定义和使用宏(也称做变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为: 

macroname = macrotext

  使用宏的格式为:

$(macroname)

  我们用 “宏” 的方式,来改写上面的 Makefile 例子。

OBJS = prog.o code.oCC = gcctest: $(BOJS)        $(CC) $(OBJS) -o testprog.o: prog.c code.h        $(CC) -c prog.c -o prog.ocode.o: code.c code.h        $(CC) -c code.c -o code.oclean:        rm -f *.o test
0 0