【问题标题】:gmake can't find generated sourcesgmake 找不到生成的源
【发布时间】:2013-06-25 12:51:32
【问题描述】:

我有一个程序,它的一些源是生成的。 makefile 的相关部分是这样的:

OUTPUT_FILE = libEngine.so
CONF_FILES = foo.tgp bar.tgp
GENERATED = Engine.cfg
SRCS = main.cpp foo.cpp bar.cpp 
OBJ_FILES = $(SRCS:%.cpp=$(OBJDIR)/%.o)

all: $(OUTPUT_FILE)

$(OUTPUT_FILE): $(GENERATED) $(OBJ_FILES)
   <link command>

$(GENERATED): $(CONF_FILES)
   generate -p Engine $(CONF_FILES)

$(OBJDIR)/%.o:%.cpp
   <compile command>

'generate' 命令创建 Engine.cfg(文本文件)、foo.cpp 和 bar.cpp

当我运行它时,在 some 平台上,sometimes,gmake 在生成和编译非生成后停止,说它没有从创建对象的规则生成的来源。

我想我知道问题出在哪里 - gmake 在创建文件之前评估了依赖项。但是,我看不到如何正确编写它。而且我也不明白为什么它有时会失败。

编辑示例代码现在更加完整。 (当然,原版有更多的文件和选项)

【问题讨论】:

  • 那么变量GENERATED在哪里以及如何获得它的值?
  • 类似:GENERATED = table.cfg GENERATED_SRCS = gen1.cpp gen2.cpp
  • 等等...这些规则中的哪一个运行失败?你能给我们一个最小的完整例子吗?
  • hmmm...我不确定哪个是失败的规则。运行gmake后,我有foo.cpp bar.cpp和main.o,它说它没有创建foo.o的规则

标签: makefile gnu-make


【解决方案1】:

发现问题,与VPATH有关。 cpp 文件不是在当前目录中生成的,而是在另一个目录中,它被定义在包含的 makefile 中的某个位置。如果文件不存在,我猜 VPATH 位置不起作用。

我是这样解决的:

all: $(GENERATED) $(OBJ_FILES)
     $(MAKE) $(OUTPUT_FILE)

$(OUTPUT_FILE): $(GENERATED) $(OBJ_FILES)
    <link command>

到目前为止一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2020-07-07
    • 1970-01-01
    • 2020-08-20
    • 2011-07-10
    相关资源
    最近更新 更多