在描述文件中使用宏
在描述文件中定义了宏后,请通过在宏名称前放上 $(美元符号)在描述文件命令中使用宏。
如果宏名称长于一个字符,请将宏名称用 ( )(圆括号)或者{ }(花括号)括起来。 下面是使用宏的示例:
$(CFLAGS)
$2
$(xy)
$Z
$(Z)前面的列表中的最后两个示例等效。
下面的片段显示了如何定义和使用一些宏:
# OBJECTS is the 3 files x.o, y.o and
# z.o (previously compiled)
OBJECTS = x.o y.o z.o
# LIBES is the standard library
LIBES = -lc
# prog depends on x.o y.o and z.o
prog: $(OBJECTS)
# Link and load the 3 files with
# the standard library to make prog
cc $(OBJECTS) $(LIBES) -o prog使用此描述文件的 make 命令将链接并装入带有 libc.a 库的三个对象文件 (x.o, y.o和 z.o)。
命令行中输入的宏定义覆盖描述文件中的任何副本宏定义。 因此,以下命令将使用 lex 装入文件 (-11)库:
make "LIBES= -ll"注意:当宏包含空格且您是在命令行中输入空格,请将宏括在 " "(双引号)中。 没有双引号,shell 将空格解释为参数分隔符而不是宏的一部分。
make 命令能够处理多达 10 层的嵌套宏扩展。 根据以下示例中的定义,表达式$($(macro2))将评估为value1:
macro1=value1 macro2=macro1每次引用宏时,将对宏求值。 在定义宏时,并不对它求值。 如果宏被定义但是从未使用,那么从不对其进行求值。 如果为宏赋了 shell 要解释的值,这就尤其重要,特别是在值可能更改的情况下。 变量声明如下:
OBJS = 'ls *.o'如果在构建和除去对象文件的过程中,在不同的时间引用,值可能更改。 它并不在 OBJS 宏被定义时保持 ls 命令的值。