我正在为 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)
是错误的。 您已将配方(要调用的命令(与目标放在同一行上,因此请认为配方命令实际上是一组先决条件。 运行时:
make H=3 C=3
此行扩展为:
run: ./forkk.out 3 3
并尝试找到一种方法来构建导致您看到的错误的先决条件"3"。
你想要这个:
run:
./forkk.out $(H) $(C)
如果你真的希望它在一行上,你必须使用;
将规则与配方行分开:
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
目标没有依赖项,因此每次构建该目标时都会执行其配方,从下一行开始(和结束(。
但是,请注意,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