Linux编程 makefile文件

  • 格式:doc
  • 大小:45.50 KB
  • 文档页数:3

Linux编程 makefile文件

Makefile文件中包含着一些目标文件,来告诉make做什么,通常目标就是文件名,对每一个目标,提供了实现这个目标的一组命令以及和这个目标有依赖关系的其他目标或文件名。

makefile文件的定义规则如下:

Target : Dependencies

Command

其中,Target(目标)是程序产生的文件,像可执行文件和目标文件;目标也可以是要执行的动作,例如clean。Dependencies(依赖)是用来产生目标的输入文件,一个目标通常依赖于多个文件。Command(命令)是make执行的动作,一个规则可以有多个命令,每个占单独一行,每个命令行的起始字符必须为Tab字符。

提 示 规则解释如何和何时重做该规则中的文件,make根据依赖关系执行产生或更新目标;规则也说明如何和何时执行动作。有的规则看起来很复杂,但都符合这个模式。

例如,以下是一个简单的makefile的例子:

#一个简单的Makefile

prog:prog1.o prog2.o

gcc prog1.o prog2.o -o prog

prog1.o:prog1.c lib.h

gcc -c -I. -o prog1.o prog1.c

prog2.o:prog2.c

gcc -c prog2.c

以上Mamefile中定义了三个目标:prog、prog1和prog2,分号后是依赖文件列表,中间用一个分号隔开;

对于第一个目标文件prog来说,他有两个依赖文件:prog1.o和prog2.o,任何一个依赖文件更新,prog也要随之更新,命令gcc prog1.o prog2.o -o prog是生成prog的命令。make检查目标是否需要更新时采用递归的方法,递归从底层向上对过时目标进行更新,只有当一个目标所依赖的所有目标都为最新时,这个目标才会被更新。

以上面的Makefile为例,我们修改了prog2.c,执行make时,由于目标prog依赖prog1.o和 prog2.o,所以要先检查prog1.o和prog2.o是否过时,目标prog1.o依赖prog1.c和lib.h,由于我们并没修改这两个文件,所以他们都没有过期,接下来再检查目标prog2.o,他依赖prog2.c,由于我们修改了prog2.c,所以prog2.c比目标文件 prog2.o要新,即prog2.o过期,而导致了依赖prog2.o的所有目标都过时;这样make会先更新prog2.o再更新prog。

如果某一行过长,已经到了文本编辑器的右边界,可用一个反斜杠"\"做换行符,反斜杠所连接的所有行都会被当成一行来处理;另外在Makefile中涉及的文件名允许使用通配符(?或*)。

有时候为了简化命令的书写,可以在Makefile中定义一些宏和使用缩写,下面是几个很使用的缩写:

 $@ 代表该目标的全名

 $* 代表已经删除了后缀的目标名

 $< 代表该目标的第一个相关目标名

 $? 所有源文件名

现在就可以使用缩写对以上Makefile做相应的修改:

#使用缩写的Makefile

prog:prog1.o prog2.o

gcc prog1.o prog2.o -o $@

prog1.o:prog1.c lib.h

gcc -c -I. -o $@ $<

prog2.o:prog2.c

gcc -c $*.c

在一个项目中,可能几个目标中使用同一个文件a.c,如果以后这个文件被修改,那么需要修改Makefile中所有的a.c,这样就比较麻烦,可以定义宏来解决这个问题,宏可以使Makefile更加清晰:

#使用缩写和宏的Makefile

MARCO = prog1.o prog2.o

prog:$(MARCO)

gcc prog1.o prog2.o -o $@

prog1.o:prog1.c lib.h

gcc -c -I. -o $@ $<

prog2.o:prog2.c

gcc -c $*.c

对于很大的项目来说,自己手写Makefile非常麻烦,而标准的GNU软件(如Apacle)都是运行一个configure脚本文件来产生 Makefile;GNU软件automake和autoconf就是自动生成configure的工具。开发人员只需要先定义好宏,automake处理后会产生供autoconf使用的Makefine.in,再用autoconf就可以产生configure。要使用automake和 autoconf必须安装:GNU Automake,GNU Autoconf,GNU m4,perl和GNU Libtool。

假设你有一个源文件test.c,用autoscan可以产生一个configure.scan文件,编辑这个文件:

dnl Process this file with autoconf to produce a configure script.

AC_INIT(test.c)

AC_INIT_AUTOMAKE(test,1.0)

dnl Checks for programs.

AC_PROG_CC

dnl Checks for libraries.

dnl Checks for header files.

dnl Checks for typedefs, structures, and compiler characteristics.

dnl Checks for library functions.

AC_OUTPUT(Makefile)

接着将configure.scan改名为cnfigure.in,再执行aclocal和autoconf,会产生aclocal.m4和 configure两个文件:我们再编辑Makefile.am文件,Makefile.am文件中包含了我们自己定义的宏以及目标文件, automake会读如这个文件并根据我们自己定义的宏产生相应的Makefile.in文件:

AUTOMAKE_OPTIONS=foreign

run_PROG=test

test_SOURCE=test.c

最后执行automake -a,执行完成后会生成configure文件说明成功。