C 生成文件错误***没有规则生成目标'3';,由'run';所需;。停止

C 生成文件错误***没有规则生成目标'3';,由'run';所需;。停止,c,makefile,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创建一个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

更具体地说,尤金的评论如下:

run: ./forkk.out $(H) $(C)
这是错误的。您已经将recipe(要调用的命令)与目标放在同一行,因此make认为recipe命令实际上是一组先决条件。运行时:

make H=3 C=3
该行扩展为:

run: ./forkk.out 3 3
make试图找到一种方法来构建导致您看到的错误的先决条件“3”

你想要这个:

run:
        ./forkk.out $(H) $(C)
如果你真的希望它在一行上,你必须使用
将规则与配方行分开:

run: ; ./forkk.out $(H) $(C)
这条规则

。。。表示“run”目标将
/forkk.out
和变量的扩展
$(H)
$(C)
作为其依赖项。当您要求
make
构建该目标时——您需要这样做——它首先确保这些依赖项是最新的。由于
$(H)
$(C)
都扩展到
3
make
在其工作目录中查找名为
3
的文件。没有找到任何这样的文件,也没有任何适用的规则来构建一个文件,它就退出了

你的意思可能是:

run:
     ./forkk.out $(H) $(C)
。在那里,
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

之后的内容移动到下一个缩进行。请注意,您的
all
规则的编译行使用
fork.o
,但这不可用(并且依赖项位于
forkk.o
)。通常,您会使
all
依赖于
forkk.out
,并且有一个规则从
forkk.o
编译
forkk.out
(或者使用内置规则直接从
forkk.c
)来编译
forkk.out
。使用as
remake-x
来调试
Makefile
clean:
     rm -f forkk.out forkk.o