makefile中以下几种自动变量的函义是什么? $* $+ $< $? $@ $^ $%
时间: 2024-05-02 19:15:20 浏览: 146
在Makefile中,以下是几种常用的自动变量及其含义:
1. $*:表示目标文件的主文件名(不包含后缀),例如,如果目标文件是test.o,则$*表示test。
2. $+:表示所有的依赖文件,以空格分隔。与$^不同的是,$+会保留重复的依赖文件。
3. $<:表示第一个依赖文件的名称。如果有多个依赖文件,$<只表示第一个。
4. $?: 表示所有比目标文件新的依赖文件列表,以空格分隔。
5. $@:表示目标文件的名称。
6. $^:表示所有的依赖文件列表,以空格分隔。
7. $%:仅适用于静态模式规则中,表示目标成员的成员名。
相关问题
makefile 中的 $@, $? 代表什么
在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。
makefile中$(AR) rcs $@ $^是什么意思
这行代码是一个Makefile规则中的命令,其中:
- $(AR)表示使用的静态库工具,通常是ar命令。
- rcs是静态库工具的选项,r表示插入新的文件或者替换已经存在的文件,c表示创建新的静态库,s表示在静态库中保存符号表。
- $@表示当前规则的目标文件。
- $^表示当前规则的所有依赖文件。
所以,$(AR) rcs $@ $^ 的意思是将当前规则的所有依赖文件打包成一个静态库,并将其保存为当前规则的目标文件。
阅读全文