我正在为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
答案 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