2011-04-20 3 views

ответ

6

Команды в правилах makefile просто передаются в оболочку, поэтому цитата абсолютно имеет значение. Это правило будет работать:

libmylib.a: ... 
    $(AR) $(ARFLAGS) [email protected] $? 

, но это не будет:

libmylib.a: ... 
    "$(AR) $(ARFLAGS) [email protected] $?" 

Второй не будет работать, потому что вы, вероятно, не имеют одну команду под названием, скажем, ar -r libx.a a.o b.o даже если вы имеют команду ar, которая знает, что делать с списком аргументов -r libx.a a.o b.o.

Ваш второй пример:

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

немного отличается, потому что кавычки вокруг аргумента оболочки встроенной в echo так что эти два правила:

rule1: 
    @echo Compiler: $(CXX) 

rule2: 
    echo "Compiler: $(CXX)" 

обычно производят то же самое вывода (если, конечно, у вас не было какой-то странной команды компилятора C++, которая имела бы, например, «>» в ​​ее имени, и в этом случае желаемый результат был бы взломом вверх головой, чтобы кто-то назвал ваш компилятор C++ и это выходит за рамки возможностей даже GNU m ака). С другой стороны, эти два правила будут производить несколько иной выход из-за взаимодействия кавычек и пробелов:

rule3: 
    @echo Compiler:   $(CXX) 

rule4: 
    echo "Compiler:   $(CXX)" 

Rule3 будет делать то же самое, как Правиле1 но rule4 бы напечатать строку с кучей пробелов в середине.

+0

Очень хороший ответ. Благодаря! – pic11

Смежные вопросы