我有一个冗长的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
仅了解您在makefile中指定的依赖项。通常,此问题的解决方案是将适当的标题命名为目标文件的其他先决条件。这就是该规则正在尝试执行的操作...
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp (SRCDIR)/%.hpp (SRCDIR)/%.h $(CXX) $(FLAGS) $(OFLAGS) $(BINOFLAGS) $(CXXFLAGS) -I$(GRBPATH)/mac64/include -c $< $(CXX_o)$@
,但同时存在语法和语义问题。
从语法上讲,您已从打算用作变量引用的表达式中省略了两个$
,而不是(SRCDIR)
。
这很容易修复,但这仅是主要问题的解决方法:(更正后的)规则仅适用于构建具有相应$(SRCDIR)
和相应.cpp
和相应的.hpp
,该名称既可以存在也可以自己构建。对于您要构建的所有对象来说,也许确实是这种情况,但是根据我的经验,C ++源文件具有两个相应的标头并不常见。除非您有其他适用于构建对象的规则,否则.h
将报告错误,例如您观察到没有两个相应标头的对象
此外,如果您的任何目标文件都依赖于头文件而不是直接与它们相对应的头文件,则该规则不会捕获这些依赖关系。因此,它不能可靠地生成受给定标头更改影响的所有对象的重建。
解决方案是为每个目标正确指定所有依赖项。您可能无法通过模式规则来执行此操作,但是可以提供其他仅前提条件的规则来指定标头依赖项。您可以手动编写此类规则,但是如果您有很多目标,或者它们的依赖项列表经常更改,则编写和维护起来会很痛苦且容易出错。但是,如果使用支持它的工具链,则可以通过多种方法自动生成这些依赖关系规则。有很多在线资源对此进行了讨论,例如
make
make