Makefile GNU制造报价

Makefile GNU制造报价,makefile,gnu-make,Makefile,Gnu Make,引用有什么区别吗 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) $@ $?
# 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 a.o b.o
,即使您有一个
ar
命令知道如何处理
-r libx.a 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的能力。另一方面,由于引号和空格的交互作用,这两个规则将产生稍微不同的输出:

rule3:
    @echo Compiler:           $(CXX)

rule4:
    echo "Compiler:           $(CXX)"

Rule3将做与Reule1相同的事情,但是Rule4将在中间打印一组空白的字符串。