如何写 makefile文件

如何写 makefile文件

学习别人的程序就面临着重写makefile的问题.下面以问答的形式来解释如何写makefile文件.

1.makefile的核心:

target...(目标文件|object文件|可执行文件|标签) : prerequisites( 生成target所需要的文件,也可以是target中的一种...)

Command (shell 命令)

target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。prerequisites中如果有一个以上的文件比target文件更新的话,command所定义的命令就会执行。

2.make 的工作原理:

例, 文件名:makefiletest

test : test.o

gcc -o test test.o

test.o: test.h test.c

gcc -c test.c

clean:

rm test.o test

在默认方式下,只输入make命令。其会做如下工作:

make会在当前目录下找名字为“Makefile文件”或“makefile文件”的文件。如果找到,它会找文件中的第一个目标文件(target)。在上面的例子中,它会找到makefiletest这个文件,并把test作为最终的目标文件;如果test文件不存在,或是test所依赖的后面的 .o 文件的修改时间要比test这个文件新,它就会执行后面所定义的命令来生成test文件。

如果test所依赖的.o文件也存在,make会在当前文件中找目标为.o文件的依赖性,如果找到,则会根据规则生成.o文件(这有点像一个堆栈的过程)。

当然,C文件和H文件如果存在,make会生成 .o 文件,然后再用 .o 文件生成make的最终结果,也就是执行文件test。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,make就会直接退出,并报错。而对于所定义的命令的错误,或是编译不成功,make就不会处理。如果在make找到了依赖关系之后,冒号后面的文件不存在,make仍不工作

通过上述分析,可以看出像clean这样没有被第一个目标文件直接或间接关联时,它后面所定义的命令将不会被自动执行,不过,可以显式使make执行。即使用命令make clean,以此来清除所有的目标文件,并重新编译。

在编程中,如果这个工程已被编译过了,当修改了其中一个源文件时,比如test.c,根据依赖性,目标test.o会被重新编译(也就是在这个依赖性关系后面所定义的命令),则test.o文件也是最新的,即test.o文件的修改时间要比test要新,所以test也会被重新连接了。

3 定义变量:

ltest=test.h test.c

上面的makefiletest可以改写为:

test : test.o

gcc -o test test.o

test.o: $(ltest)

gcc -c test.c

clean:

rm test.o test

4 makefile文件的自动推导

test : test.o

gcc -o test test.o

test.o: test.h

clean:

rm test.o test

看一下test.o这个target,省略了 prerequisites的 test.c和command的gcc -c test.c,这些是target为test.o能推导出来的.

5 清空目标文件

.PHONY : clean

clean :

-rm test.o test

前面说过,.PHONY表示clean是一个“伪目标”,而在rm命令前面加了一个小减号的目的是,如果某些文 件出现问题将被忽略,继续进行后面的操作。当然,clean的规则不要放在文件的开头,否则会变成make的 默认目标。不成文的规矩是“clean从来都放在文件的最后”

6.注释:

#. 为行注释,与//类似

7.显示指定makefile文件名

将makefiletest改为make.test

make -f make.test

8.TAB键

为command命令的识别键,在command头使用,最好不要用在其它地方

9.包含 其它 makefile文件

include <filename>

filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)。在include前面可以有一些空字符,但是绝不能以[Tab]键开始。include和<filename>可以用一个或多个空格隔开。举个例子,有这样几个makefile文件:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,下面的语句:

include foo.make *.mk $(bar)

等价于:

include foo.make a.mk b.mk c.mk e.mk f.mk

10 -include和sinclude 都可以ignore error,

11. make的工作顺序

(1) 读入所有的makefile文件。

(2) 读入被include包括的其他makefile文件。

(3) 初始化文件中的变量。

(4) 推导隐式规则,并分析所有规则。

(5) 为所有的目标文件创建依赖关系链。

(6) 根据依赖关系,决定哪些目标要重新生成。

(7) 执行生成命令。

12.转义字符与通配符

/

*,?,[...],~

其它请参见用户手册.

你可能感兴趣的:(编程,C++,c,gcc,C#)