有效的宏引用$(CFLAGS)$Z$(Z)其中最后两个引用是完全一致的。需要注意的是一些宏的预定义变量,在Unix系统中,$*、$@、$?和$<四个特殊宏的值在执行命令的过程中会发生相应的变化,而在GNU make中则定义了更多的预定义变量。关于预定义变量的详细内容,宏定义的使用可以使我们脱离那些冗长乏味的编译选项,为编写makefile文件带来很大的方便。# Define a macro for the object filesOBJECTS= filea.o fileb.o filec.o# Define a macro for the library fileLIBES= -LS# use macros rewrite makefileprog: $(OBJECTS)cc $(OBJECTS) $(LIBES) -o prog……---------------------------------------------------------
此时如果执行不带参数的make命令,将连接三个目标文件和库文件LS;但是如果在make命令后带有新的宏定义:make "LIBES= -LL -LS" #如何实现?则命令行后面的宏定义将覆盖makefile文件中的宏定义。若LL也是库文件,此时make命令将连接三个目标文件以及两个库文件LS和LL。在Unix系统中没有对常量NULL作出明确的定义,因此我们要定义NULL字符串时要使用下述宏定义:STRINGNAME= //这里有待考证makefile 中的变量(宏)GNU 的 make 工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系以及建立目标的命令的特色。其中之一就是变量或宏的定义能力。如果你要以相同的编译选项同时编译十几个 C 源文件,而为每个目标的编译指定冗长的编译选项的话,将是非常乏味的。但利用简单的变量定义,可避免这种乏味的工作:# Define macros for name of compilerCC = gcc# Define a macr o for the CC flagsCCFLAGS = -D_DEBUG -g -m486# A rule for building a object filetest.o: test.c test.h$(CC) -c $(CCFLAGS) test.c在上面的例子中,CC 和 CCFLAGS 就是 make 的变量。GNU make 通常称之为变量,而其他 UNIX 的 make 工具称之为宏,实际是同一个东西。在 makefile 中引用变量的值时,只需变量名之前添加 $ 符号,如上面的 $(CC) 和 $(CCFLAGS)。GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表 13-2给出了一些主要的预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。表 13-2 GNU make 的主要预定义变量