【问题标题】:gnu make recipe / target written with % not workinggnu make recipe / target 用 % not working
【发布时间】:2012-09-17 11:21:35
【问题描述】:

使用 GNU Make 3.81

我得到的错误是:

make:没有规则来制作“unittest/build/xlineunittestrunner”所需的目标“unittest/build/inMessages.o”。停下来。

我将目标写在 makefile 中:

$(BUILDDIR)/%.o: %.c
  $(CC) $(INCLUDES) $(DEFINES) -c $< -o $@

如果我用inMessages 替换%(在$(BUILDDIR)/%.o: %.c 中),它可以工作。我不确定为什么 % 不匹配 inMessages

编辑:

我认为问题不在于有其他规则匹配 .o 文件。以下是 makefile 中的完整规则列表:

all: printinfo checkdirs $(BUILDDIR)/xlineunittestrunner

printinfo:
  @echo "SRCS = $(SRCS)" 
  @echo "OBJ  = $(OBJ)"
  @echo "SOURCEDIRS = $(SOURCEDIRS)" 
  @echo "OBJECTS    = $(OBJECTS)"
  @echo "OBJECTSTOBUILD = $(OBJECTSTOBUILD)"
  @echo "BUILDDIR = $(BUILDDIR)"  

$(BUILDDIR)/xlineunittestrunner: $(OBJECTSTOBUILD)
  $(CC) -o $@ -c $^

$(BUILDDIR)/%.o: %.c
  $(CC) $(INCLUDES) $(DEFINES) -c $< -o $@

checkdirs: $(BUILDDIR)

$(BUILDDIR):
  @mkdir -p $@

【问题讨论】:

  • 您确定 makefile 中没有其他内容可能会干扰模式规则吗?可能需要inMessages 中不存在的其他依赖项,例如$(BUILDDIR)/%.o: %.h
  • 另外,这个规则是如何被调用的?您是直接输入 make 并让 Make 选择 Makefile 中的第一条规则,还是输入 make something
  • 它被调用为make all。让所有调用 ,如果 /build 不存在,checkdirs 只会创建它。 Target 首先检查目标文件,然后检查 .c 文件并构建目标文件,最后链接可执行文件。不知何故,我的 object/c 文件的目标搞砸了,而不是模式匹配......

标签: makefile gnu gnu-make


【解决方案1】:

做下面的改变它会起作用

%.o: %.c:

      $(CC) $(INCLUDES) $(DEFINES) -c $< -o $(BUILDDIR)/$@

逻辑是 $(BUILDDIR)/%.o 和 $(BUILDDIR)/$@ 是一样的。

如果你不能有针对性地改变配方:)

【讨论】:

    【解决方案2】:

    呃。问题是在将 sourcedirs 添加到 VPATH 时出现(额外字符)错字。模式匹配正常,只是找不到任何源代码文件。

    【讨论】:

      【解决方案3】:

      当您将% 替换为inMessages 时,它会将隐式模式规则转换为显式规则。显式规则优先于隐式模式规则。一定是有另一个模式规则产生%.o

      我会尝试使用 -d -p 运行 make 并查看匹配的规则。如果您不使用它们,-r 开关可能有助于禁用内置的隐式模式规则。

      【讨论】:

      • 我不同意。如果存在另一个模式规则,其先决条件存在(或可以制定),那么 Make 可能会运行该规则而不是该规则;如果该其他规则的先决条件不存在(并且无法制定),则 Make 将运行此规则。无论哪种方式,我们都不会收到此错误。
      猜你喜欢
      • 2016-10-23
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2022-12-27
      相关资源
      最近更新 更多