使文件错误***没有规则使目标“ 3”运行,而“运行”则需要。停止

时间:2018-09-05 16:19:16

标签: c makefile

我正在为C创建一个makefile,我通过命令行传递了两个参数。这就是我在命令行上运行的。

    dipesh@ubuntu:~/Desktop$ make run H=3 C=3

但是我遇到了以下错误

Make File Error *** No rule to make target `3', needed by `run'.  Stop

这是我的制作文件

all: forkk.o
     gcc -Wall fork.o -o forkk.out
forkk.o: forkk.c
     gcc -Wall -c forkk.c

run: ./forkk.out $(H) $(C)

clean:
     rm forkk

2 个答案:

答案 0 :(得分:2)

要具体说明Eugene的评论,请执行以下行:

run: ./forkk.out $(H) $(C)

是错误的。您已将配方(要调用的命令)与目标放在同一行,因此使认为配方命令实际上是一组先决条件。运行时:

make H=3 C=3

此行扩展为:

run: ./forkk.out 3 3

并尝试寻找一种方法来构建前提条件“ 3”,从而导致您看到的错误。

您想要这个:

run:
        ./forkk.out $(H) $(C)

如果您确实希望将其放在一行上,则必须使用;将规则与配方行分开:

run: ; ./forkk.out $(H) $(C)

答案 1 :(得分:2)

这条规则...

run: ./forkk.out $(H) $(C)

...表示“运行”目标具有./forkk.out且变量$(H)$(C)的扩展为其依赖项。当您要求make建立该目标时,您首先要确保那些依赖关系是最新的。由于$(H)$(C)都扩展为3,因此make在其工作目录中查找名为3的文件。没有找到任何这样的文件,也没有任何适用的规则来建立文件。

您可能是这个意思,

run:
     ./forkk.out $(H) $(C)

。此处,run目标具有 no 依赖性,因此每次构建目标时都会执行其配方(从下一行开始(和结束))。

但是请注意,run目标确实对forkk.out具有善意依赖性,该修订规则并未对此表示。可能也一样,因为它也不是目标,所以make不知道如何构建它。一个更强大的Makefile会同时引入依赖和目标,就像这样:

all: forkk.out

forkk.out: forkk.o
     gcc -Wall forkk.o -o forkk.out

forkk.o: forkk.c
     gcc -Wall -c forkk.c

run:
     ./forkk.out $(H) $(C)

还要注意,您的clean规则会清除其他规则均未创建的文件,而无法清除其他规则确实会创建的文件。可能应该是

clean:
     rm -f forkk.out forkk.o