GNU报价

pic*_*c11 4 makefile gnu-make

引用有什么不同吗?

libmylib.a: ...
    $(AR) $(ARFLAGS) $@ $?
# vs
libmylib.a: ...
    "$(AR) $(ARFLAGS) $@ $?"


@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"
Run Code Online (Sandbox Code Playgroud)

谢谢!

mu *_*ort 7

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会打印一个中间有一堆空格的字符串.