引用有什么不同吗?
libmylib.a: ...
$(AR) $(ARFLAGS) $@ $?
# vs
libmylib.a: ...
"$(AR) $(ARFLAGS) $@ $?"
@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"
Run Code Online (Sandbox Code Playgroud)
谢谢!
makefile规则中的命令只是被提供给shell,所以引用绝对重要.此规则将起作用:
libmylib.a: ...
$(AR) $(ARFLAGS) $@ $?
Run Code Online (Sandbox Code Playgroud)
但这个不会:
libmylib.a: ...
"$(AR) $(ARFLAGS) $@ $?"
Run Code Online (Sandbox Code Playgroud)
第二个不起作用,因为你可能没有一个叫做的命令,比如说,ar -r libx.a a.o b.o
即使你有一个ar
知道如何处理-r libx.a a.o b.o
参数列表的命令.
你的第二个例子:
@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"
Run Code Online (Sandbox Code Playgroud)
有点不同,因为引号是围绕shell内置的参数echo
所以这两个规则:
rule1:
@echo Compiler: $(CXX)
rule2:
echo "Compiler: $(CXX)"
Run Code Online (Sandbox Code Playgroud)
通常会产生相同的输出(当然,除非你有一些奇怪的C++编译器命令,例如,在其名称中有一个">",在这种情况下,所需的输出对于任何人来说都是一个优势命名你的C++编译器,这甚至超出了GNU make的能力.另一方面,由于引号和空格的交互,这两个规则会产生略微不同的输出:
rule3:
@echo Compiler: $(CXX)
rule4:
echo "Compiler: $(CXX)"
Run Code Online (Sandbox Code Playgroud)
rule3会执行与rule1相同的操作,但rule4会打印一个中间有一堆空格的字符串.