make-файл c ++ не обнаруживает изменения в файлах .h - PullRequest
0 голосов
/ 11 января 2020

У меня есть файл longi sh make, и часть, где он компилирует мои файлы исходного кода, находится здесь

$(MAINFILE):    $(BINDIR) $(OBJDIR) $(SCIPLIBFILE) $(LPILIBFILE) $(NLPILIBFILE) $(MAINOBJFILES)
        $(LINKCXX) $(MAINOBJFILES) $(LINKCXXSCIPALL) $(LDFLAGS)  -I$(GRBPATH)/mac64/include -L$(GRBPATH)/mac64/lib -lgurobi_c++ -lgurobi81 $(LINKCXX_o)$@

$(OBJDIR)/%.o:  $(SRCDIR)/%.cpp  
        $(CXX) $(FLAGS) $(OFLAGS) $(BINOFLAGS) $(CXXFLAGS) -I$(GRBPATH)/mac64/include -c  $< $(CXX_o)$@

Изменения файла заголовка вступают в силу только тогда, когда я все очищаю, а затем компилирую с нуля. Я пробовал это:

$(MAINFILE):    $(BINDIR) $(OBJDIR) $(SCIPLIBFILE) $(LPILIBFILE)   $(NLPILIBFILE) $(MAINOBJFILES)
            $(LINKCXX) $(MAINOBJFILES) $(LINKCXXSCIPALL) $(LDFLAGS)  -I$(GRBPATH)/mac64/include -L$(GRBPATH)/mac64/lib -lgurobi_c++ -lgurobi81 $(LINKCXX_o)$@

$(OBJDIR)/%.o:  $(SRCDIR)/%.cpp   (SRCDIR)/%.hpp  (SRCDIR)/%.h
        $(CXX) $(FLAGS) $(OFLAGS) $(BINOFLAGS) $(CXXFLAGS) -I$(GRBPATH)/mac64/include -c  $< $(CXX_o)$@ 

Но я получаю сообщение об ошибке:

make: *** No rule to make target `obj/static/O.darwin.x86_64.gnu.opt/ColG_main.o

Я немного новичок в make-файлах, и мне было интересно, смогу ли я решить эту проблему.

1 Ответ

1 голос
/ 11 января 2020

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 сообщит об ошибке, подобной той, которую вы наблюдали для объектов, у которых нет обоих соответствующих заголовков

Более того, если какой-либо из ваших объектных файлов зависит от Заголовки, отличные от тех, которые им непосредственно соответствуют, тогда это правило не фиксирует эти зависимости. Поэтому он не будет надежно производить перестройки всех объектов, затронутых данным изменением заголовка.

Решение состоит в том, чтобы правильно указать все зависимости для каждой цели. Вы, вероятно, не можете сделать это с помощью правила шаблона, но вы можете предоставить дополнительные правила только для предварительных требований, чтобы указать зависимости заголовка. Вы можете написать такие правила вручную, но если у вас много целей или если их списки зависимостей часто меняются, то это болезненно и подвержено ошибкам при написании и обслуживании. Если вы используете цепочку инструментов, которая поддерживает его, то есть способы автоматически сгенерировать эти правила зависимости. Есть много онлайн-ресурсов, обсуждающих это, таких как

...