2016-08-30 5 views
0

Мне нужна помощь для создания соответствующего make-файла (поддерживающего инкрементную компиляцию) для нескольких файлов .hpp и .cpp.Записать makefile для .cpp и .hpp C++

Я искал информацию о том, как создать соответствующий make-файл, но я не уверен, как это сделать.

У меня есть следующие файлы: 2048.cpp, game.cpp, game.hpp, gameutils.cpp, gameutils.hpp, menu.cpp, menu.hpp, saveandback.cpp, saveandback.hpp и tile.hpp

Сейчас я использую следующие Makefile:

all: 2048.cpp tile.hpp menu.hpp menu.cpp gameutils.hpp gameutils.cpp saveandback.hpp saveandback.cpp game.hpp game.cpp 
    g++ -g -W -Wall --pedantic -DNDEBUG 2048.cpp -o power 

clean: 
    $(RM) power 

Спасибо за вашу помощь.

+2

Предоставление заголовков выглядит чрезмерно. Какой у Вас вопрос? – alexeykuzmin0

+0

Как правильно писать. –

+0

@CAB моя домашняя работа не основана на создании make-файла, но я должен предоставить его, поскольку я не очень любезно отношусь к этому, поэтому я спрашиваю вас, можете ли вы мне помочь. Я красновато много документации о том, кто писать make-файлы, но это не дает мне много помощи. Но спасибо, я собираюсь взглянуть на GNU Build System. –

ответ

5

Предостережение: Я не использовал make за какое-то время, поэтому я могу немного ржаво на POSIX и GNU-make конкретных вещах. В последние несколько лет могут появиться новые функции, о которых я не знаю. Пожалуйста, не стесняйтесь вносить исправления. Также большая часть из них - из памяти.

Есть несколько вещей, которые отсутствуют в вашем знании, установленные здесь, что вы можете использовать, чтобы создать достойную Makefile, что только вновь компилирует вещи, когда это необходимо:

  • Generic Rules - Они могут быть использованы для обеспечения общего правило для создания имени файла с одним суффиксом из другого. Например. следующая определяют правила для создания любого * .o из его соответствующего * .cpp:

    %.o: %.cpp 
        stuff 
    

    В POSIX сделать фактически определены эти правила как:

    .cpp.o: 
        stuff 
    

    Я использую синтаксис GNU ниже, но вы можете (и, возможно, захотите) заменить синтаксисом POSIX (спорный, если вы оставите их и используйте неявные правила, хотя, см. ниже).

  • Automatic Variables

    • $< расширится на вход правила.
    • [email protected] будет расширяться до цели правила.
  • Переменные - Вы можете объявлять переменные и дать им значения, например:

    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 для получения более подробной информации и примера.

+0

Большое спасибо за вашу помощь :) –

+2

Это хороший, тщательный ответ! Если вы рискуете удлинить еще больше, было бы лучше, если бы вы оказались в Make'е встроенной $ $ (LINK.cpp) $^$ (LOADLIBES) $ (LDLIBS) -o $ @ '- так близко от того, где вы находитесь, но поэтому готовы к следующим шагам аскера ... –

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