Makefile:7:目标(在同一规则中多次给出

Makefile:7: target ( given more than once in the same rule

本文关键字:规则 目标 Makefile      更新时间:2023-10-16

我不熟悉make system。 当我尝试执行如下所示的程序时,没有问题:

./prog.out arg1 arg2 arg3

当我决定使用 make 时,我将以下脚本添加到 makefile

parse ${parameters}:
     ./prog.out ${parameters}

当这运作良好时,它很奇怪;

 make parse parameters="aaa bbb ccc"

这些字符:"("和")"会生成错误!

make parse parameters="( d , ( d , ( d , d ) ) )"
Makefile:7: target `(' given more than once in the same rule.
Makefile:7: target `d' given more than once in the same rule.
Makefile:7: target `,' given more than once in the same rule.
Makefile:7: target `(' given more than once in the same rule.
Makefile:7: target `d' given more than once in the same rule.
Makefile:7: target `,' given more than once in the same rule.
Makefile:7: target `d' given more than once in the same rule.
Makefile:7: target `)' given more than once in the same rule.
Makefile:7: target `)' given more than once in the same rule.
./prog.out  ( d , ( d , ( d , d ) ) )
/bin/sh: 1: Syntax error: "(" unexpected
make: *** [parse] Error 2

但这效果很好;

./prog.out "( d , ( d , ( d , d ) ) )"

制作版本是 3.81

知道吗?

parse ${parameters}:
     ./prog.out ${parameters}

上面的生成文件片段创建一个名为 parse 的目标,并在变量 parameters 的扩展中为每个单词创建一个目标。

因此,在您的调用make parse parameters="aaa bbb ccc"中,该行扩展到parse aaa bbb ccc:,您最终定义了四个目标parseaaabbbccc

随着调用make parse parameters="( d , ( d , ( d , d ) ) )"它扩展到parse ( d , ( d , ( d , d ) ) ):,你可以定义目标parse, d ,,andwith d being listed four times,three times,three times) 三次。(这就是为什么抱怨目标被重新定义的原因。

如果您只想在运行的命令中将其用作parameters变量,那么您根本不需要在目标行中使用它。

parse:
     ./prog.out "${parameters}"

,然后使用

make parse parameters="aaa bbb ccc

make parse parameters="( d , ( d , ( d , d ) ) )"

一旦我遇到同样的问题,并且在多次头痛之后,我发现变量的定义(对应于我的 Makefile 中的文件夹定义)之后有一些"空格"。消除它们使其有效...

就我而言,OP 提到的错误是由变量声明末尾的注释引起的。

MAIN := main.c # entry point

将注释移动到另一行(单独)解决了问题。

# entry point
MAIN := main.c

我遇到了同样的错误。 文件夹名称中有一个空格。 Eclipse 不能很好地处理文件夹名称或项目名称中的空格。