赞
踩
1. makefile的语法
2. make命令的选项和参数
3. makefile文件中的注释
4. makefile文件中的宏
5. 多个目标
6. 内置规则
7. 后缀和模式规则
8. 用make管理库函数
9. 高级主题:makefile文件和子目录
10.GUN make和gcc
4.makefile文件中的宏
在前面三篇文章中讲述的内容就是make命令和makefile文件的全部,对于管理包含多个源文件的项目来说,它们仍然是强有力的工具。但是,对于管理包含非常多源文件的大型项目来说,它们就显得过于庞大并缺乏弹性。因此,makefile文件允许你使用宏以一种更通用的格式来书写它们。
你通过语句MACRONAME=value在makefile文件中定义宏,引用宏的方法是使用
(
M
A
C
R
O
N
A
M
E
)
或
(MACRONAME)或
(MACRONAME)或{MACRONAME}。make的某些版本还接受$MACRONAME的用法。如果想把一个宏的值设置为空,你可以令等号(=)后面留空。
makefile文件中的宏常被用于设置编译器的选项。在软件的开发过程中,通常开发人员不会对编译结果进行优化,而是将调试信息包含进去。但对于软件的发行版,往往又需反过来做,即编译结果是一个不包含调试信息的容量较小的二进制可执行文件,使其执行速度尽可能快。
Makefile1文件的另一问题是,它假设编译器的名字是gcc,而在其他UNIX系统中,编译器的名字可能是cc或c89。如果想将makefile文件移植到另一版本的UNIX系统中,或在现有系统中使用另一个编译器,为了使其工作,你将不得不修改makefile文件中许多行的内容。宏是用来收集所有这些与系统相关内容的好方法,通过使用宏定义,你可以方便地修改这些内容。
宏通常都是在makefile文件中定义的,但你也可以在调用make命令时在命令行上给出宏定义,例如命令make CC=c89。命令行上的宏定义将覆盖在makefile文件中的宏定义。当在makefile文件之外使用宏定义时,要注意宏定义必须以单个参数的形式传递,所以应避免在宏定义中使用空格或应像下面这样给宏定义加上引号:make “CC = c89”。
实验:带宏定义的makefile文件
下面是makefile文件的升级版本Makefile2,它使用了一些宏定义;
all:myapp
#what compiler
CC = gcc
#Where are include files kept
INCLUDE = .
#Options for development
CFLAGS = -g -Wall -ansi
myapp: main.o 2.o 3.o
$(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
clean:
-rm *.o myapp
注意:此源代码会上传到资源里
删除就得安装(中间)文件,并通过这个新的makefile文件创建新的安装文件,可以看到如下输出:
实验解析:
make命令将
(
C
C
)
、
(CC)、
(CC)、(CFLAGS)和$(INCLUDE)替换为相应的宏定义,这与C语言编译器对#define语句的处理方式很相似。现在,如果想改变编译器命令,你只需修改makefile文件中的一行即可。
事实上,make命令内置了一些特殊的宏定义,通过使用它们,你可以让makefile文件变得更加简洁。我们将几个较常用的宏列在下中,其使用方法可以在后面的示例中看到。这些宏在使用前才展开,所以它们的含义会随着makefile文件的处理进展而发生变化。事实上,如果这些内置宏的用法不是这样,它们就没有什么用处了。
在makefile文件中,你可能还会看到下面两个有用的特殊字符,它们出现在命令之前。
❑ -:告诉make命令忽略所有错误。例如,如果想创建一个目录,但又想忽略任何错误(比如目录已存在),你就可以在mkdir命令的前面加上一个减号。你将在本章后面的例子中看到符号-的应用。
❑ @:告诉make在执行某条命令前不要将该命令显示在标准输出上。如果想用echo命令给出一些说明信息,这个字符将非常有用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。