makefile 中的 $@, $? 代表什么
时间: 2024-09-12 15:09:02 浏览: 45
Makefile详解 && Makefile中文文档.zip
在Makefile中,`$@` 和 `$?` 是一些特殊的变量:
1. `$@` 表示当前规则的目标(target),即Makefile中当前行定义要生成的文件。比如在 `main: main.o stack.o maze.o` 这一行中,`$@` 就是指 `main`。
2. `$?` 表示当前规则隐含依赖项(implicit dependencies)的最后一个非空元素。这个特性在自动依赖更新(Automatic dependency generation)时很有用。当你运行 `make` 命令时,Make会查找最近修改过的源文件并添加它们作为隐含依赖。如果你的 `main` 文件依赖于 `main.o`,当 `main.o` 更新后,`$?` 将返回 `main.o`。
举个例子:
```makefile
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
all: main
main: main.o
```
在这个例子中,当你运行 `make all` 时,Make会先查看 `main` 规则的隐含依赖 (`$?`),找到 `main.o` 并编译它。然后,`main` 规则的真正目标 `main` 也会被创建。
要重新生成 `maze.c` 的依赖关系并保存为 `maze.d.1234`(假设Shell进程ID为1234),你可以这样做:
```makefile
# 假设当前的Makefile路径
ifeq ($(shell whoami), 1234)
MAZE_D_FILE := maze.d.1234
else
MAZE_D_FILE := maze.d
endif
%.d: %.c
$(RM) -f $@
$(CC) -MM $(CPPFLAGS) $< > $@.$$$$
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@
rm -f $@.$$$$
.PHONY: update-maze-d
update-maze-d: $(MAZE_D_FILE)
# 具体实现依赖关系更新的命令,这里省略实际操作
# 更新maze.c的依赖关系
update-maze-d
```
在上述代码中,`update-maze-d` 目标会生成 `maze.d` 或者 `maze.d.1234`,具体取决于当前Shell进程ID。
阅读全文