2015-06-05 3 views
1

В чем разница между .cpp.o:, .o: и %.o: %.c?
Вот простой пример Makefile:Разница в шаблонах шаблонов файлов

CC=g++ 
CFLAGS=-c -Wall 
SOURCES=file1.cpp file2.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=program 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(OBJECTS) -o [email protected] 

#.o: 
#.cpp.o: 
%.o: %.c 
    $(CC) $(CFLAGS) $< -o [email protected] 

all: $(SOURCES) $(EXECUTABLE) 

clean: 
    rm -rf $(OBJECTS) $(EXECUTABLE) 

Я заметил, что выход такой же, но я предполагаю, что они интерпретируются по-разному внутренне. Есть ли предпочтительный способ сделать это?

+0

Моего предпочтительным способом * не имеющими * любое правилом джокера. Я использую одно правило для исходного файла, чтобы управлять зависимостями файлов '.h', а также некоторые другие вещи. – Eregrith

+0

Я согласен с тем, что правила для файла хороши, особенно для небольших проектов. – kometonja

ответ

3
.cpp.o: # build *.o from *.cpp (old style notation) 

%.o: %.c # build *.o from *.c (new style notation) 

Оба работает, но новый стиль является более мощным, поскольку он позволяет создавать более сложные конструкции благодаря сопоставлению с образцом:

%.uuu: %.vvv %.www 
+0

Я заметил, что makefile из моего примера не учитывает параметр -g, если я использую правило% .o:% .c – kometonja

+0

@kometonja [GNU make] (https://www.gnu.org/software/make/manual/html_node/Options-Summary.html), похоже, не поддерживает параметр '-g'. – dlask