c ++ makefile未检测到.h文件中的更改

莫非斯

我有一个冗长的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 对应关系的对象文件,这些文件.h既可以存在也可以自己构建。对于您要构建的所有对象来说,也许确实是这种情况,但是以我的经验,C ++源文件具有两个相应的标头并不常见。除非您有其他适用于构建对象的规则,make否则将报告错误,例如您针对没有两个相应标头的对象观察到的错误

此外,如果您的任何目标文件都依赖于头文件而不是直接与它们相对应的头文件,则该规则不会捕获那些依赖项。因此,它将无法可靠地生成受给定标头更改影响的所有对象的重建。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Eclipse中未检测到设备

来自分类Dev

在Piwik中未检测到PHP 5.3.3

来自分类Dev

git status / git diff -C未检测到索引中的文件副本

来自分类Dev

在RecyclerView for Intent中未检测到OnClick

来自分类Dev

Python difflib:未检测到更改

来自分类Dev

Webpack未检测到文件更改

来自分类Dev

在Ubuntu 13.10(Samsung Series 3 NP350V5C)中未检测到触摸板

来自分类Dev

未检测到-std = c ++ 03编译

来自分类Dev

C-程序未检测到空格

来自分类Dev

实体框架未检测到C#中的jsonb属性更改

来自分类Dev

C ++线程未检测到全局变量更改

来自分类Dev

为什么在C#中未检测到我的GetKeyUp?

来自分类Dev

Laravel文件上传:未检测到文件

来自分类Dev

Webpack未检测到文件更改

来自分类Dev

jQuery中未检测到输入

来自分类Dev

在Ubuntu 13.10(Samsung Series 3 NP350V5C)中未检测到触摸板

来自分类Dev

观察者未检测到导入的文件更改

来自分类Dev

如何确保我的makefile检测到我的头文件和cpp文件中的更改?

来自分类Dev

ProductName-Swift.h在更改目标C文件中的相应一个时未更新

来自分类Dev

在WPF DataGrid中未检测到CTRL + C

来自分类Dev

UITextField更改未检测到?

来自分类Dev

git status / git diff -C未检测到索引中的文件副本

来自分类Dev

Hibernate未检测到MySQL更改

来自分类Dev

SAS宏未检测到文件

来自分类Dev

在日食中未检测到设备。

来自分类Dev

在Ubuntu 16.04中未检测到USB

来自分类Dev

在16.04 ubuntu中未检测到声卡

来自分类Dev

未检测到 pygame 中的按键

来自分类Dev

Jenkins Mercurial 插件未检测到更改