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
и т. Д.? Эти отношения здесь не представлены, поэтому перестройки не будут надежными.
Не работает - что происходит? Я предполагаю, что вы правильно отделили строку g ++ ... –