【问题标题】:Makefile pattern rule fails?Makefile 模式规则失败?
【发布时间】:2011-03-01 14:01:33
【问题描述】:

在使用 GNU-make 时,我的 Makefile 有一些模式规则:

%.o:%.c
    gcc $< -o:$@

这条规则是我添加的。

但是当我做它时,它会给出一个错误,说 No rule to make target %.o and doesn't build the targets。

有时,还会出现这种其他行为。当我第一次说 make 时它没有构建目标(它给出错误说 No rule to make target),但是当我立即再次说 make 时,它​​确实构建正确。

所以当我明确地分别指定每个源文件时,它会第一次自己构建目标。

编辑:我在 Centos 上使用 GNU-make(我猜是 v6.3,不确定)。这可能是一些权限/用户 ID/组 ID 问题吗?

有任何指示可以了解可能发生的情况和解决方案吗?

谢谢你, -AD。

【问题讨论】:

  • 这里有完全相同的问题。上帝,我讨厌 makefile 及其愚蠢的语法和任意限制。

标签: gnu-make


【解决方案1】:

Make 仅使用模式规则作为一种后备。例如:

$ ls
Makefile
$ cat Makefile
%.o: %.c
    gcc $< -o $@
$ make
make: *** No targets.  Stop.

这很好。 Make 不考虑模式规则,因为您没有要求它进行任何操作,并且 makefile 中没有默认目标。让我们让它做一些可能使用模式规则的东西。

$ make 1.o
make: *** No rule to make target `1.o'.  Stop.

预期。 1.c 不存在,因此不考虑模式规则。让我们再试一次。

$ touch 1.c
$ make 1.o
gcc 1.c -o 1.o

(然后是一些关于 main 丢失的错误)。

我个人非常不喜欢这些后备规则。我更喜欢明确列出目标。类似的东西

file.o file2.o f.o: %.o: %.c
    ...

为您提供目标特定模式规则。这些是完全不同的(参见手册)。 [哦,在这个点头的例子中,模式没有给你任何优势。]

【讨论】:

  • 在第二个示例中(与我遇到的类似),它说“没有规则将目标设为‘1.o’”似乎有点用户不友好。而不是指出由于文件丢失而无法匹配的规则。可以说确实存在规则;只是前提条件不满足。
  • 对于make 来说,找出丢失的文件通常是一项不可能完成的工作。请记住,模式规则可以链接在一起(.yy.c.o 等)。 make -R 你的朋友。在编写 makefile 时,获得正确的先决条件是必不可少的。如果错误,则并行 make 将无法正常工作,您还不如使用批处理文件。
【解决方案2】:

您可能需要在规则的第一行中的 : 周围使用空格。此外,gcc 在输出文件名前不带冒号;只需使用-o $@

【讨论】:

  • @Ok 这些是我的错别字。 Makefile 没有任何错误。问题仍然存在..
  • 你能在你的目标上尝试make -d吗?它会喷出很多输出,但是您可以看到它正在尝试什么规则,并且可能会看到出了什么问题。如果您认为这有助于诊断问题,您也可以发布结果。
【解决方案3】:

刚刚遇到这个问题。

如果这是你的规则:

%.o:%.c
    gcc $< -o:$@

确保 gcc 之前的第二行有一个制表符而不是空格。我花了几个小时才弄清楚。 正如其他人指出的那样,在 -o 标志之后也没有':'。

【讨论】:

    【解决方案4】:

    如果你只把它放在 Makefile 中并调用 ma​​ke

    %.o: %.cpp
      g++ -g -o $@ -c $<
    

    它告诉:make: *** No targets. Stop.

    因为它不是目标。这是一个规则。

    如果您的另一个目标需要 .o 文件,它将起作用。

    main.exe: main.o add.o
      g++ -g -o $@ $^
    
    %.o: %.cpp
      g++ -g -o $@ -c $<
    

    【讨论】:

      【解决方案5】:

      您确定 .c 文件存在吗?我认为按照前面的建议使用 -d 应该有助于调试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多