特殊的宏

在运行任何目标集(target rule set)中的指令之前,有一些预定义的特殊宏 -

  • $@ 要创建的文件的名称。

  • $? 是被更改的对应文件名。

例如,在下列场景中我们可以使用如下规则:

  1. hello: main.cpp hello.cpp factorial.cpp
  2. $(CC) $(CFLAGS) $? $(LDFLAGS) -o $@
  3. 或者
  4. hello: main.cpp hello.cpp factorial.cpp
  5. $(CC) $(CFLAGS) $@.cpp $(LDFLAGS) -o $@

在这个例子中,像 $(CC) $(CFLAGS) $? $(LDFLAGS) -o $@ 这样的操作行应该在行首输入一个制表符 (\t) ,否则 make 会报错。 其中的 $@ 代表 hello 同时 $? 或者 $@.cpp 则代表所有已修改源文件。

同时默认规则中还有另外两个特殊的宏。他们分别是 -

  • $< 触发操作的相关文件的名称。

  • $* 由目标文件和依赖文件共享的前缀。

常见的隐式规则是用于构建 .cpp(源文件)之外的 .o(对象)文件。

  1. .cpp.o:
  2. $(CC) $(CFLAGS) -c $<
  3. 或者
  4. .cpp.o:
  5. $(CC) $(CFLAGS) -c $*.c