GNU make引用

4

引用有什么区别吗?

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


@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"

谢谢!

1个回答

7

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接