makefile的 $@ $<的作用
时间: 2023-12-02 08:03:11 浏览: 27
在Makefile中,$@和$<是自动化变量,它们分别表示当前规则中的目标文件和依赖文件中的第一个文件。
$@表示当前规则中的目标文件,用于表示当前构建的目标文件名,可以看作是“目标”或“规则”的名称。
$<表示当前规则中的依赖文件中的第一个文件,用于表示当前需要构建的依赖文件名,可以看作是“依赖关系”中的名称。
例如,如果有一个规则如下:
```
target: dependency
command
```
其中,target是目标文件,dependency是依赖文件,command是构建目标文件的命令。此时,$@表示目标文件的名称target,$<表示依赖文件的名称dependency。
在Makefile中,使用$@和$<可以方便地引用当前规则中的目标文件和依赖文件,避免了手动输入文件名的繁琐操作。
相关问题
%.d : %.c @$(CC) -M $(CFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$
这段代码是一个Makefile规则中的一部分,用生成依赖关系文件。让我来解释一下每一行的含义:
1. `@$(CC) -M $(CFLAGS) $< > $@.$$$$; \`
这行代码使用预定义的变量`$(CC)`表示编译器,`$(CFLAGS)`表示编译选项。`$<`表示规则中的第一个依赖文件,`$@.$$$$`表示生成的临时文件。
这行代码的作用是执行编译器命令,并将依赖关系输出到临时文件中。
2. `sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \`
这行代码使用sed命令对临时文件进行处理,将其中的目标文件名替换为目标文件和依赖文件的形式。
具体来说,`\($*\)\.o[ :]*`表示匹配目标文件名(不包括扩展名)后面的冒号和空格,`\1.o $@ :`表示替换为目标文件、依赖文件和冒号的形式。
最后将处理结果输出到目标文件中。
3. `rm -f $@.$$$$`
这行代码用于删除临时文件。
总的来说,这段代码的作用是生成一个包含目标文件和其依赖关系的文件。在Makefile中,这个文件会被包含进来,以确保在编译时能够正确地处理依赖关系。
$(CC) $(CFLAGS) -c -o $@ $<的作用解析
这是一个Makefile中编译C源文件为目标文件的规则。
- $(CC)表示使用的C编译器的名称,它是一个预定义的Makefile变量,比如gcc或clang等。
- $(CFLAGS)表示传递给编译器的参数,它也是一个预定义的Makefile变量,可以用于设置编译器的选项,比如优化级别,编译标准等。
- -c表示编译源文件为目标文件,而不是链接成可执行文件。
- -o $@表示生成的目标文件的名称,$@是一个自动化变量,表示当前规则中的目标文件名。
- $<表示当前规则中的依赖文件中的第一个文件,它也是一个自动化变量,在这里表示当前需要编译的源文件名。
因此,这个规则的作用是将C源文件编译为目标文件,使用预定义的C编译器和参数,生成的目标文件名与当前规则的目标文件名相同。