这是我的简单 Makefile:
运行.exe:链接 gcc link.o -o 运行 link.o: main.o fun.o ld -r main.o fun.o -o link.o main.o: main.c gcc -c main.c -o main.o fun.o:函数文件.c gcc -c functionfile.c -o fun.o 干净的: 德尔*.o 删除*.exe
问题并不是真正关于创建“run.exe”,我知道有几种创建它的方法。但是,当我编写 **Makefile** 时,我不小心忘记在依赖于“run.exe”的“link”之后写入“.o”(当我在运行“make”后发现以下错误时我知道这一点):
gcc -c main.c -o main.o
gcc -c functionfile.c -o fun.o
ld -r main.o fun.o -o link.o
cc link.o -o link
process_begin: CreateProcess(NULL, cc link.o -o link, ...) failed.
make (e=2): The system cannot find the file specified.
<builtin>: recipe for target 'link' failed
make: *** [link] Error 2
我猜它所说的找不到的文件是link
因为它以前不存在并且没有任何 Makefile 命令创建它。我的问题是,如果link
找不到目标 2,3 和 4 的命令如何成功运行并能够创建各自的.o
文件?为什么在link
没有执行任何命令的情况下没有找到ie时不同时返回?如果我的猜测是正确的或错误的,请帮我排序,告诉我正在发生的实际情况和问题!!?这是什么recipe for target 'link' failed
,因为我没有任何名为 的目标link
?
答案1
问题来自于你的第一行Makefile
:
run.exe: link
这导致 Make 尝试找出如何创建link
.它知道如何link
构建link.o
,因此它使用提供的规则来创建link.o
,然后尝试link
使用其引用的内置规则来创建cc
。但你没有cc.exe
命令,所以它失败了——这就是丢失的文件。所有这些都解释了“<builtin>:目标'链接'的配方失败”错误消息:Make在尝试link
使用内置规则创建时失败。
要解决此问题,请指定正确的先决条件:
run.exe: link.o
gcc $^ -o $@
这使用自动变量来避免规则中的重复信息:$^
代表“所有先决条件”( link.o
),$@
代表“目标的文件名”( run.exe
)。