分类分类
关注+2011-02-17作者:佚名
七、makefile中的宏
在makefile中可以使用诸如XLIB、UIL等类似于Shell变量的标识符,这些标识符在makefile中称为“宏”,它可以代表一些文件名或选项。宏的作用类似于c语言中的define,利用它们来代表某些多处使用而又可能发生变化的内容,可以节省重复修改的工作,还可以避免遗漏。
Make的宏分为两类,一类是用户自己定义的宏,一类是系统内部定义的宏。用户定义的宏必须在makefile或命令行中明确定义,系统定义的宏不由用户定义。我们首先介绍第一种宏。
这里是一个包含宏的makefile文件,我们将其命名为mymakefile2,如下所示:
all: main # 使用的编译器 CC = gcc #包含文件所在目录 INCLUDE = . # 在开发过程中使用的选项 CFLAGS = -g -Wall –ansi # 在发行时使用的选项 # CFLAGS = -O -Wall –ansi main: main.o f1.o f2.o $(CC) -o main main.o f1.o f2.o main.o: main.c def1.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c f1.o: f1.c def1.h def2.h $(CC) -I$(INCLUDE) $(CFLAGS) -c f1.c f2.o: f2.c def2.h def3.h $(CC) -I$(INCLUDE) $(CFLAGS) -c f2.c |
我们看到,在这里有一些注释。在makefile中,注释以#为开头,至行尾结束。注释不仅可以帮助别人理解我们的makefile,如果时间久了,有些东西我们自己也会忘掉,它们对makefile的编写者来说也是很有必要的。
现在言归正传,先看一下宏的定义。我们既可以在make命令行中定义宏,也可以在makefile中定义宏。在makefile中定义宏的基本语法是:
宏标识符=值列表 |
其中,宏标识符即宏的名称通常全部大写,但它实际上可以由大、小写字母、阿拉伯数字和下划线构成。等号左右的空白符没有严格要求,因为它们最终将被make删除。至于值列表,既可以是零项,也可以是一项或者多项。如:
LIST_VALUE = one two three |
当一个宏定义之后,我们就可以通过$(宏标识符)或者${宏标识符}来访问这个标识符所代表的值了。
在makefile中,宏经常用作编译器的选项。很多时候,处于开发阶段的应用程序在编译时是不用优化的,但是却需要调试信息;而正式版本的应用程序却正好相反,没有调试信息的代码不仅所占内存较小,进过优化的代码运行起来也更快。
对于Mymakefile1来说,它假定所用的编译器是gcc,不过在其他的UNIX系统上,更常用的编译器是cc或者c89,而非gcc。如果你想让自己的makefile适用于不同的UNIX操作系统,或者在一个系统上使用其他种类的编译器,这时就不得不对这个makefile中的多处进行修改。
但对于mymakefile2来说则不存在这个问题,我们只需修改一处,即宏定义的值就行了。除了在makefile中定义宏的值之外,我们还可以在make命令行中加以定义,如:
$ make CC=c89 |
当命令行中的宏定义跟makefile中的定义有冲突时,以命令行中的定义为准。当在makefile文件之外使用时,宏定义必须作为单个参数进行传递,所以要避免使用空格,但是更妥当的方法是使用引号,如:
$ make “CC = c89” |
这样就不必担心空格所引起的问题了。现在让我们将前面的编译结果删掉,来测试一下mymakefile2的工作情况。命令如下所示:
$ rm *.o main $ make -f Mymakefile2 |
就像我们看到的那样,Make程序会用相应的定义来替换宏引用$(CC )、$(CFLAGS )和$(INCLUDE),这跟C语言中的宏的用法比较相似。
上面介绍了用户定义的宏,现在介绍make的内部宏。常用的内部宏有:
$? :比目标的修改时间更晚的那些依赖模块表。 |
相关文章
更多+相同厂商
热门推荐
点击查看更多
点击查看更多
点击查看更多
说两句网友评论