make
знает только о зависимостях, которые вы указываете в вашем make-файле. В общем случае решение этой проблемы состоит в том, чтобы назвать соответствующие заголовки в качестве дополнительных предварительных условий для объектных файлов. Это то, что, по-видимому, пытается сделать это правило ...
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp (SRCDIR)/%.hpp (SRCDIR)/%.h
$(CXX) $(FLAGS) $(OFLAGS) $(BINOFLAGS) $(CXXFLAGS) -I$(GRBPATH)/mac64/include -c $< $(CXX_o)$@
, но с ним есть проблемы как syntacti c, так и semanti c.
Синтаксически вы исключили два $
из выражений, предназначенных для ссылок на переменные, (SRCDIR)
вместо $(SRCDIR)
.
Это достаточно легко исправить, но это всего лишь фидер в основная проблема: (исправленное) правило применяется только к созданию объектных файлов, имеющих соответствующие .cpp
и соответствующие .hpp
и соответствующие .h
которые либо существуют, либо сами могут быть построены. Возможно, это действительно так для всех объектов, которые вы хотите построить, но, по моему опыту, для исходного файла C ++ нетипично иметь два соответствующих заголовка. За исключением случаев, когда у вас есть какое-то другое правило, применимое для построения объекта, make
сообщит об ошибке, подобной той, которую вы наблюдали для объектов, у которых нет обоих соответствующих заголовков
Более того, если какой-либо из ваших объектных файлов зависит от Заголовки, отличные от тех, которые им непосредственно соответствуют, тогда это правило не фиксирует эти зависимости. Поэтому он не будет надежно производить перестройки всех объектов, затронутых данным изменением заголовка.
Решение состоит в том, чтобы правильно указать все зависимости для каждой цели. Вы, вероятно, не можете сделать это с помощью правила шаблона, но вы можете предоставить дополнительные правила только для предварительных требований, чтобы указать зависимости заголовка. Вы можете написать такие правила вручную, но если у вас много целей или если их списки зависимостей часто меняются, то это болезненно и подвержено ошибкам при написании и обслуживании. Если вы используете цепочку инструментов, которая поддерживает его, то есть способы автоматически сгенерировать эти правила зависимости. Есть много онлайн-ресурсов, обсуждающих это, таких как