这是我的简单 Makefile:
#create an exe file
run: link
gcc link.o -o run
#sketch link.o
link.o: main.o sum.o
ld -r main.o sum.o -o link.o
#sketch main.o
main.o: main.c
gcc -c main.c -o main.o
#sketch sum.o
sum.o: sum.c
gcc -c sum.c -o sum.o
#make clean recipie
clean:
rm *.o
rm run
这个 makefile 可能有点不成熟或薄弱。但我真正关心的是目标被击中的过程。在讲述实际问题之前,让我们先看看它的输出。
gcc -c main.c -o main.o
gcc -c sum.c -o sum.o
ld -r main.o sum.o -o link.o
cc link.o -o link
gcc link.o -o run
我的问题是:这是因为link
依赖性run
还是因为link.o
在命令部分中提到,命令run
再次寻找它是因为它make
的依赖性寻找提及依赖性或者因为在命令部分然后目标中的第一个命令是分别遇到and和?是因为依赖项中提到的文件还是命令中提到的文件?link.o
main.o
sum.o
link.o
main.o
sum.o
main.o
sum.o
link.o
这可能与您之前的问题重复,实际上是什么导致了 make 中的“系统找不到指定的文件”问题?,但让我们用这个来详细解释发生了什么。
Make 从字面上理解你的 Makefile 声明:
run: link
告诉它run
需要link
,关联的配方告诉它要创建run
,它应该执行gcc link.o -o run
link.o: main.o sum.o
告诉它link.o
需要main.o
和sum.o
,关联的配方告诉它要创建link.o
,它应该执行ld -r main.o sum.o -o link.o
main.o: main.c
告诉它main.o
需要main.c
,关联的配方告诉它要创建main.o
,它应该执行gcc -c main.c -o main.o
sum.o: sum.c
sum.c
对and做同样的事情sum.o
当你跑步时
Make 尝试满足 Makefile 中的第一个目标,
run
. 它发现没有link
文件,并且您的 Makefile 中也没有指定如何构建link
. 然而Make“知道”如何从一个文件构建一个无扩展名的.o
文件,所以它使用内置的规则来构建link
;解决为这是
cc
命令的来源(严格来说,它是$(CC)
Make 变量的默认值)。一旦
link
可用,Make 认为先决条件run
已满足,并运行相应的配方:请注意,此处
link
并未实际使用。它只会混淆事物;你应该把第一条规则写成详细来说,Make 解析
run
如下:run
需要link
link
没有明确的规则,但可以使用内置规则构建link.o
link.o
需要main.o
和sum.o
main.o
需求main.c
, 存在sum.o
需求sum.c
, 存在先决条件现在已解决,Make 可以运行配方:
gcc -c main.o -o main.o
建立main.o
gcc -c sum.c -o sum.o
建立sum.o
ld -r main.o sum.o -o link.o
建立link.o
cc link.o -o link
建立link
gcc link.o -o run
建立run
如果将
run
规则重写为run: link.o
,分辨率将更改为run
需要link.o
link.o
需要main.o
和sum.o
main.o
需求main.c
, 存在sum.o
需求sum.c
, 存在和构建
gcc -c main.o -o main.o
建立main.o
gcc -c sum.c -o sum.o
建立sum.o
ld -r main.o sum.o -o link.o
建立link.o
gcc link.o -o run
建立run