【问题标题】:Make searches dependencies in the wrong place将搜索依赖项放在错误的位置
【发布时间】:2011-12-21 03:58:23
【问题描述】:

我对 (GNU) Make 比较陌生,发现它非常困难。我考虑改用 SCons,但我还是想了解一下。

我在一个文件夹中有一个 makefile,它包含子目录 ./src、./obj/[release|debug] 和 ./bin[release|debug]。 makefile 应该能够获取 ./src 中的 C++ 源代码,将它们编译为相应 ./obj 目录中的目标文件,并链接这些目标文件并将结果放入相应的 ./bin 目录中。这是我的makefile(为简单起见进行了编辑):

CONFIG = release
#CONFIG = debug

OBJS = Container.o

OBJDIR = obj/$(CONFIG)
BINDIR = bin/$(CONFIG)

VPATH = src $(BINDIR)
vpath %.o $(OBJDIR)

.PHONY: release

release:  $(OBJS)
    $(CXX) $(LXXFLAGS) -o $(BINDIR)/$@ $^

Container.o: Container.cpp Container.hpp
    $(CXX) -c $(CXXFLAGS) -o $(OBJDIR)/$@ $<

我第一次运行 make 时,“发布”目标将在当前文件夹以及 $(OBJDIR) 中搜索“Container.o”。找不到它,将正确执行 secong 目标,在正确的文件夹中生成目标文件。然后“release”目标将执行,但链接器会抱怨“Container.o”未找到...

我第二次运行 make 时,“发布”目标将搜索“Container.o”并在 $(OBJDIR) 中找到它。然后链接器将正确执行(找到“Container.o”的路径被添加到文件名之前)。

有没有办法让它一次通过?它让我发疯!

【问题讨论】:

  • 您尝试过交换规则吗?先放Container.o规则,再放release规则。

标签: makefile


【解决方案1】:

Make 确实有很长的学习曲线,而且您正在尝试一些棘手的事情(这正好遇到了 Make 的一大弱点,即通配符处理不佳)。我不确定我的回答是否有助于混淆,但至少它会解决您的具体问题。

如果您想使用CONFIG 方法,可以这样做:

CONFIG = release
#CONFIG = debug                                                                 

OBJS = Container.o

TRUE_OBJS = $(addprefix obj/$(CONFIG)/, $(OBJS))

vpath %.cpp src

.PHONY: $(CONFIG)

$(CONFIG): bin/$(CONFIG)/$(CONFIG)

bin/$(CONFIG)/$(CONFIG): $(TRUE_OBJS)
    $(CXX) $(LXXFLAGS) -o $@ $^                                               

$(TRUE_OBJS): obj/$(CONFIG)/%.o : %.cpp
    $(CXX) -c $(CXXFLAGS) -o $@ $<

但是您可以不使用它(并且在您想要更改配置时无需编辑makefile):

OBJS = Container.o

vpath %.cpp src

.PHONY: release debug

release: bin/release/release
debug: bin/debug/debug

bin/release/release: $(addprefix obj/release/, $(OBJS))
bin/debug/debug: $(addprefix obj/debug/, $(OBJS))

bin/release/release bin/debug/debug:
    $(CXX) $(LXXFLAGS) -o $@ $^   

obj/release/%.o obj/debug/%.o: %.cpp
    $(CXX) -c $(CXXFLAGS) -o $@ $<                                            

【讨论】:

  • 我明白了。本质上,您摆脱了 vpath %.o $(OBJDIR),并明确地将路径放在目标文件的前面?这就说得通了!谢谢!还有什么比 CONFIG 更好的方法?
  • 我认为上面的第二种方法比CONFIG好。如果你要拥有更多的配置,只有这两个,那么有办法简化它,否则它就和我知道的一样好。
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多