【发布时间】: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 错误响应。
我试过了:
-
在 Makefile 中明确指定文件名而不是 %.c,将 %.c 替换为 'test.c test2.c',它可以正常工作。
-
在当前目录下创建一个文件%.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