【问题标题】:gnu make: No rule to make target '%.c'gnu make:没有规则来制作目标'%.c'
【发布时间】:2021-11-27 03:48:11
【问题描述】:

我需要使用gnu make的模式规则,但我总是遇到同样的错误:

make: *** 没有规则来制作目标 '%.c','test' 需要。停下来。

这是我的 Makefile:

all: test
test : %.c
    gcc -o $@ $?

Makefile 是从当前目录下的 .c 文件构建一个执行文件,第三行以 'tab' 字符开始。我确实制作了:

make all

当前目录里面有两个c文件:

-rw-rw-r-- 1 user user   43 Nov 27 11:18 test2.c
-rw-rw-r-- 1 user user  109 Nov 27 11:01 test.c

它总是以相同的 %.c 错误响应。

我试过了:

  1. 在 Makefile 中明确指定文件名而不是 %.c,将 %.c 替换为 'test.c test2.c',它可以正常工作。

  2. 在当前目录下创建一个文件%.c,也可以正常工作,因为make可以找到'%.c'的文件。

我的make版本是:

$make --version
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

我不知道为什么模式规则功能不起作用。

任何指针将不胜感激。

【问题讨论】:

  • 规则all : %.c不是模式规则,但更重要的问题是:你想让make all做什么?
  • 我不认为你可以使用模式规则作为先决条件而不在目标中使用它们。像all: $(wildcard *.c) 这样的东西适合你吗?
  • 我修改了 Makefile 以表明我的意图。希望它可以帮助您了解我想要做什么。
  • 很难从不起作用的脚本中推断出意图。我认为@NickODell 的建议会起作用,只要有一个源文件比test 更新。
  • @Beta,脚本无法工作是我在这里发布问题的原因。我只需要避免枚举所有 .c 文件进行编译。通配符是唯一的方法吗?发明什么模式规则?

标签: gnu-make


【解决方案1】:

模式规则是一个模板,它告诉make,如果你想构建一个匹配这个目标模式的目标,你可以找到或构建一个匹配先决条件模式的先决条件,那么这里有一个关于如何做到这一点的秘诀。

模式规则并不是说“去寻找所有匹配这个模式的文件并为它们使用这个规则”的定义。

如果您想要源文件列表,那么您可以在您的 makefile 中手动列出它们,或者使用$(wildcard ...) 来查找它们。

【讨论】:

    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多