引用有什么区别吗?
libmylib.a: ...
$(AR) $(ARFLAGS) $@ $?
# vs
libmylib.a: ...
"$(AR) $(ARFLAGS) $@ $?"
@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"
谢谢!
makefile规则中的命令只是简单地传递给shell,因此引号绝对很重要。这个规则将起作用:
libmylib.a: ...
$(AR) $(ARFLAGS) $@ $?
libmylib.a: ...
"$(AR) $(ARFLAGS) $@ $?"
ar -r libx.a a.o b.o
的单个命令,尽管您确实有一个 ar
命令知道如何处理 -r libx.a a.o b.o
参数列表。@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"
这里有些不同,因为引号括住了shell内置命令echo
的参数,所以这两条规则:
rule1:
@echo Compiler: $(CXX)
rule2:
echo "Compiler: $(CXX)"
通常情况下,以下这两条规则会产生相同的输出(当然,除非你的C++编译器命令中有一些奇怪的符号,比如“>”,在这种情况下,期望的输出将是对命名你的C++编译器的人的惩罚,这已经超出了甚至GNU make的能力)。另一方面,由于引号和空格的交互作用,这两个规则将产生略微不同的输出:
rule3:
@echo Compiler: $(CXX)
rule4:
echo "Compiler: $(CXX)"
规则3与规则1执行的操作相同,但规则4会打印一个带有一堆空格的字符串。