Предостережение: Я не использовал make за какое-то время, поэтому я могу немного ржаво на POSIX и GNU-make конкретных вещах. В последние несколько лет могут появиться новые функции, о которых я не знаю. Пожалуйста, не стесняйтесь вносить исправления. Также большая часть из них - из памяти.
Есть несколько вещей, которые отсутствуют в вашем знании, установленные здесь, что вы можете использовать, чтобы создать достойную Makefile, что только вновь компилирует вещи, когда это необходимо:
Generic Rules - Они могут быть использованы для обеспечения общего правило для создания имени файла с одним суффиксом из другого. Например. следующая определяют правила для создания любого * .o из его соответствующего * .cpp:
%.o: %.cpp
stuff
В POSIX сделать фактически определены эти правила как:
.cpp.o:
stuff
Я использую синтаксис GNU ниже, но вы можете (и, возможно, захотите) заменить синтаксисом POSIX (спорный, если вы оставите их и используйте неявные правила, хотя, см. ниже).
Automatic Variables
Переменные - Вы можете объявлять переменные и дать им значения, например:
SOURCES=2048.cpp gameutils.cpp saveandback.cpp
Etc.
замены текста - Вы можете использовать функции замены текста для замены суффиксов, например:
OBJECTS=$(SOURCES:.cpp=.o)
Будет установлено OBJECTS
, равное SOURCES
, но с изменением .cpp
на .o
.
Multiple Rules - Если для одной и той же цели задано несколько правил, их предпосылки объединяются.
Phony Targets
Собираем все вместе вы можете получить начало, оставляя зависимости заголовка сейчас:
SOURCES=2048.cpp menu.cpp gameutils.cpp saveandback.cpp game.cpp
OBJECTS=$(SOURCES:.cpp=.o)
power: $(OBJECTS)
g++ $(OBJECTS) -o [email protected]
%.o: %.cpp
g++ -c $< -o [email protected]
И это традиционное определить all
правило, которое является фальшивым поскольку на самом деле нет файла с именем «все»:
.PHONY: all
SOURCES=2048.cpp menu.cpp gameutils.cpp saveandback.cpp game.cpp
OBJECTS=$(SOURCES:.cpp=.o)
all: power
power: $(OBJECTS)
g++ $(OBJECTS) -o [email protected]
%.o: %.cpp
g++ -c $< -o [email protected]
Теперь у нас есть еще default rules, в том числе один для %.o: %.cpp
, а также у него есть default variables. Таким образом, вы можете уменьшить выше этого, если вы хотите (лично я предпочитаю, чтобы явно указать правила, но это только мне):
.PHONY: all
SOURCES=2048.cpp menu.cpp gameutils.cpp saveandback.cpp game.cpp
OBJECTS=$(SOURCES:.cpp=.o)
all: power
power: $(OBJECTS)
$(CXX) $(CXXFLAGS) $(OBJECTS) -o [email protected]
Теперь, как для ваших заголовков, имея в виду несколько правил вещь, вы можете просто добавить эти предварительные условия вручную на основе их включений, например:
.PHONY: all
SOURCES=2048.cpp menu.cpp gameutils.cpp saveandback.cpp game.cpp
OBJECTS=$(SOURCES:.cpp=.o)
all: power
power: $(OBJECTS)
$(CXX) $(CXXFLAGS) $(OBJECTS) -o [email protected]
2048.o: menu.hpp game.hpp
menu.o: menu.hpp
game.o: game.hpp
И так далее. Возможно, вы также хотите «чистый» правило, другой фиктивной цели, и это не помешает поставить бинарного имя переменной, так как вы используете его в нескольких местах, например:
.PHONY: all clean
SOURCES=2048.cpp menu.cpp gameutils.cpp saveandback.cpp game.cpp
OBJECTS=$(SOURCES:.cpp=.o)
BINARY=power
all: $(BINARY)
clean:
$(RM) $(BINARY) $(OBJECTS)
$(BINARY): $(OBJECTS)
$(CXX) $(CXXFLAGS) $(OBJECTS) -o [email protected]
И на самом деле, если вам pass -MM
- gcc
, он автоматически создаст зависимости Makefile для вас, основываясь на исходном файле. См. here для получения более подробной информации и примера.
Предоставление заголовков выглядит чрезмерно. Какой у Вас вопрос? – alexeykuzmin0
Как правильно писать. –
@CAB моя домашняя работа не основана на создании make-файла, но я должен предоставить его, поскольку я не очень любезно отношусь к этому, поэтому я спрашиваю вас, можете ли вы мне помочь. Я красновато много документации о том, кто писать make-файлы, но это не дает мне много помощи. Но спасибо, я собираюсь взглянуть на GNU Build System. –