$(CFLAGS) $Z $(Z) 其中最后两个引用是完全一致的。 需要注意的是一些宏的预定义变量,在Unix系统中,$*、$@、$?和$<四个特殊宏的值在执行命令的过程中会发生相应的变化,而在GNU make中则定义了更多的预定义变量。关于预定义变量的详细内容,宏定义的使用可以使我们脱离那些冗长乏味的编译选项,为编写makefile文件带来很大的方便。 --------------------------------------------------------- # Define a macro for the object files OBJECTS= filea.o fileb.o filec.o # Define a macro for the library file LIBES= -LS # use macros rewrite makefile prog: $(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 compiler CC = gcc # Define a macr o for the CC flags CCFLAGS = -D_DEBUG -g -m486 # A rule for building a object file test.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 的主要预定义变量