简述:Makefile 变量的定义和使用方法?Makefile模式规则中“%”的作用?Makefile 自动化"$@变量$<和$的功能? Makefile 伪目标的作用?
时间: 2024-09-06 10:03:29 浏览: 21
在Makefile中,变量的定义通常使用等号"=",变量名前可以加上"$"符号使其成为环境变量。例如:
```makefile
VAR = some value
```
要引用这个变量,直接使用$VAR即可。变量可以在命令行中替换,如$(VAR)。
`%`在模式规则中是一个特殊的占位符,代表文件名中的任何字符序列,用于匹配依赖关系中的目标文件。比如:
```makefile
%.o: %.c
gcc -c $< -o $@
```
这里`%o`表示目标文件名,`.c`表示源文件名,`$<`将自动替换为源文件的实际名称,而`$@`则会替换为目标文件的名称。
`$@`变量指的是当前正在处理的目标,`$<`则是当前活动规则链中的第一个依赖项。它们常用于生成目标文件的命令里,确保总是操作正确的输入和输出文件。
Makefile的伪目标主要有以下几个作用:
1. `.PHONY`: 用于声明那些不是由依赖关系自动触发的目标,如clean、install等,防止make误以为他们是实际存在的文件。
2. `.SUFFIXES`: 定义默认的文件扩展名到规则的映射,简化了对多个后缀支持的管理。
3. `all`: 默认的目标,当不指定目标时,make就会尝试构建它。
相关问题
makefile中以下几种自动变量的函义是什么? $* $+ $< $? $@ $^ $%
在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。