看了上一篇文章的简单例子,我们就会对makefle有了个基本的认识。但是当我们打开一个实际工程的makefile文件时,发现还是看不懂,虽然知道这是一个规则,但不能理解这些规则为什么这样写,而且里面还有一些奇奇怪怪的符号,看一个实际的例子:
根据我自己的体会,初次看到上面的内容一定会发晕,$、%、$@、ifeq、@echo这样奇怪的符号是什么意思?搞不懂的话,没法再往下继续看,所以猜测很多人看到类似的内容就打道回府了,呵呵。其实这些很简单,都有约定好的意义。本节的目的就是讲解实际makefile代码中的一些要点问题,包括这些奇怪的符号,当然还有其它许多更重要的问题。为满足你的好奇心,先把这个例子中的这几个奇怪符号解释一下:
$(OBJ):就是取变量OBJ的值,变量OBJ 定义成目标文件的路径。
%.o:是模式匹配,只要后缀是.o都能匹配。我们知道信令子系统的模块很多,而且各个模块又含很多的的.c文件,如果我们为编译每个.c文件都写一个规则,这样规则就非常多,实际中应用一条规则就可以搞定。就是采用这里的模式匹配技术,比如对tcp模块,其代码(\tcp\source)包括:tcpFunc.c、tcpMoni.c和tcpLink.c,其目标文件分别是tcpFunc.o tcpMoni.o tcpLink.o 。可以写一个规则,其目标是tcp模块整的目标文件,而倚赖文件是这四个文件。根据上一节的介绍,要生成tcp模块整的目标文件,必须要生成各个依赖文件,所以make就会去找如何生成它们的规则,最后都可以匹配到这一条模式匹配规则。这种模式匹配在实际的makefile代码中大量应用,实际也是必须使用,因为每个文件的编译基本是类似的,也不可能每个文件写一个规则。
$@:代表规则中的目标文件名,在多目标的模式规则中,它代表的是那个触发规则被执行的目标文件名。后文可以看出,多目标的规则,可分解成多个单个目标的规则(依赖和命令都一样),多个单目标规则会依次执行,$@表示执行到哪个单目标规则时的目标名。本例的规则只有一个目标,但也这样引用,当然你用$(OBJ)/%.o也可以。
@echo:echo是DOS的回显命令,前面价格@表示不显示echo命令本身,这些都是DOS命令本身的规则,非makefile的定义。实际我们在编译版本时在屏幕上看到的一系列提示信息都是用这样的方法显示出来的。
ifeq:是makefile的一个关键字,和C语言中的条件编译类似,ifeq (_OS_LINUX, $(_OS_TYPE))的意思就是判断_OS_TYPE变量的值(因为其前面有个$)是否等于_OS_LINUX,就是说如果是Linux系统,就这样处理,否则就按else中的那样处理。类似的关键字还有ifneq(判断是否不等),ifdef(判断变量是否已定义),ifndef(判断变量是否没有定义)。…
最新评论