【问题标题】:c++ makefile not detecting the changes in the .h filesc++ makefile 未检测到 .h 文件中的更改
【发布时间】:2020-01-11 07:16:30
【问题描述】:

我有一个较长的 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

我对 makefile 有点陌生,我想知道我是否可以解决这个问题。

【问题讨论】:

  • 虽然学习 make 可能是有益的,但我认为最好使用 cmake 或 meson 等工具进一步抽象您的构建过程。让它为你处理这些事情,因为你有比摆弄 make 更好的事情要做。此外,这可能是重复的:stackoverflow.com/questions/44020890/…

标签: c++ makefile gnu-make


【解决方案1】:

make 只知道您在 makefile 中指定的依赖项。一般来说,这个问题的解决方案是将适当的头文件命名为目标文件的附加先决条件。这就是这条规则似乎试图做的......

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

,但它同时存在句法和语义问题。

从语法上讲,您已经从打算作为变量引用的表达式中省略了两个 $s,(SRCDIR) 而不是 $(SRCDIR)

这很容易解决,但它只是主要问题的补充:(更正的)规则仅适用于构建具有相应 .cpp 相应 .hpp 的目标文件对应的.h 存在或可以自己构建。对于您要构建的所有对象,也许确实是这种情况,但根据我的经验,C++ 源文件具有两个对应的标头是不典型的。除非您有一些其他适用于构建对象的规则,否则make 将报告一个错误,例如您在没有两个对应标题的对象上观察到的错误

此外,如果您的任何目标文件依赖于与它们直接对应的标题以外的标题,则该规则不会捕获这些依赖关系。因此,它不会可靠地重建受给定标头更改影响的所有对象。

解决方案是正确指定每个目标的所有依赖项。您可能无法通过模式规则执行此操作,但您可以提供额外的、仅先决条件规则来指定标头依赖项。您可以手动编写此类规则,但是如果您有很多目标,或者如果它们的依赖项列表经常更改,那么编写和维护会很痛苦并且容易出错。但是,如果您使用的是支持它的工具链,那么有一些方法可以自动生成这些依赖规则。有很多在线资源讨论这个问题,例如

【讨论】:

  • 我可能可以再扩展一点:我有以下文件:Timer.hpp、Timer.cpp、pricer.hpp、pricer.cpp、Instance.hpp、Instance.cpp、helper.h , SPP.h, Reader.h 和 ColG_main.cpp 其中当然包含我的主要内容。如您所见,我在 .hpp 和相应的 cpp 文件以及 .h 文件中有一些类头和类定义,这些文件只是包含一些代码的代码 sn-ps。
  • 我能够为每个 .cpp 文件编写规则。它不是自动化的,但似乎可以工作。谢谢!
猜你喜欢
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多