2014-01-15 3 views
0

У меня есть следующие правила в моем Makefile:сделать для нескольких аналогичных правил

pieces = King Queen Knight Rook Bishop Pawn 

Chess: ChessMain.o ChessBoard.o 
g++ -Wall -g ChessMain.o ChessBoard.o -o Chess 

ChessMain: ChessBoard.hpp ChessMain.cpp 
g++ -Wall -g -c ChessMain.cpp -o ChessMain.o 

ChessBoard: ChessBoard.hpp ChessBoard.cpp 
g++ -Wall -g -c ChessBoard.cpp -o ChessBoard.o 

Piece: Piece.cpp Piece.hpp 
g++ -c Piece.cpp -o Piece.o 

King: King.cpp King.hpp Piece 
    g++ -c King.cpp -o King.o 

Rook: Rook.cpp Rook.hpp Piece 
    g++ -c Rook.cpp -o Rook.o 

... 

и одинаков для всех других шахматных фигур (подклассы Piece). Как мне сократить эти конкретные правила штук до одного общего правила? Я попробовал

$(pieces): $([email protected]:=.cpp) $([email protected]:=.hpp) 
    g++ -c $([email protected]:=.cpp) -o $([email protected]:=.o) 

но не работает.


Я редактировал весь файл.

+0

Не работает - что происходит? Я предполагаю, что вы правильно отделили строку g ++ ... –

ответ

2

Makefile, вы показываете не прав. Все правила должны использовать имя файла, которое они фактически создают как имя цели. Таким образом, наличие правила с целевым именем Piece, которое генерирует выходной файл Piece.o, неверно.

Во-вторых, вам не нужно, чтобы объектные файлы зависели от других объектных файлов. Объектные файлы зависят только от исходных и заголовочных файлов.

В-третьих, конечно, вы можете создать правила, как это (см ГНУ сделать вручную разделы неявных правил, таких как шаблонные правила):

all: King.o Piece.o Rook.o 

%.o : %.cpp %.h 
     $(COMPILE.cpp) -o [email protected] $< 

и вы сделали. Очевидно, что в вашем make-файле есть больше (предположительно, вы связываете эти объектные файлы в программу), но поскольку вы ничего не показывали, это все, с чем мы можем помочь.

ETA: (первый) файл makefile, который вы показываете выше, является неправильным. Например, у вас есть Chess целевое объявление ChessMain.o как необходимое условие, но у вас нет правила в вашем файле makefile, в котором рассказывается, как создать этот файл (вы говорите, как построить ChessMain, но это, очевидно, не одно и то же. встроенные правила для этого, что все в порядке, за исключением того, что не будет каких-либо предварительных условий, поэтому он не будет восстанавливать файлы при изменении заголовков

Вы можете написать Makefile, как это:.

CXX  = g++ 
CXXFLAGS = -Wall -g 

pieces = King Queen Knight Rook Bishop Pawn 

Chess: ChessMain.o ChessBoard.o $(addsuffix .o,$(pieces)) 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS) 

%.o : %.cpp %.hpp 
     $(COMPILE.cpp) -o [email protected] $< 

это это весь макияж. Избавьтесь от всего остального (на основе вашего примера выше).

Я должен указать, что это, вероятно, недостаточно. Например, я был бы в шоке, если бы были достаточно предварительных условий, перечисленных здесь. Несомненно, это не так, что ни один файл .cpp не включает в себя любой файл заголовка, отличный от его собственного .hpp? Конечно, файл ChessMain.cpp, например, должен #include файл King.hpp и т. Д.? Эти отношения здесь не представлены, поэтому перестройки не будут надежными.

+1

И если OP действительно хочет 'make King' сделать' King.o', тогда он может добавить прямое правило 'King: King.o' (никаких действий не требуется) и правило '.PHONY: King Knight Queen Bishop Pawn', поскольку они являются фальшивыми целями. Однако это вряд ли понадобится. –

+0

Некоторые целевые имена были предоставлены инструктором, поэтому я просто придерживался аналогичного формата для 'Piece' ... – Moronic

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