[英]Makefile: Circular - Dependency dropped
我设计了一个 Makefile,它单独编译所有 .c 文件并分别生成一个 .o (我认为这是隐式发生的,并且工作得很好)。
可执行文件 (.out) 不是从 .o 文件生成的。
生成文件:
TARGET = all.out
OBJS = file1.o file2.o file3.o
CC = gcc
CFLAGS = -g -Wall
all : $(TARGET)
$(TARGET) : $(OBJS)
# gcc $^ -o $@
run : $(TARGET)
./$<
clean :
rm -rf *.o $(TARGET)
输出:
$ make
make: Circular all.out <- all dependency dropped.
gcc -g -Wall -c -o file1.o file1.c
gcc -g -Wall -c -o file2.o file2.c
gcc -g -Wall -c -o file3.o file3.c
cp file1.o a.out
注意: Makefile 可以完美运行并产生完美的结果,如果该行没有。 其中有 7 个未注释。
行号 7:
# gcc $^ -o $@
行号时输出。 7 未注释(按预期完美工作):
gcc -g -Wall -c -o file1.o file1.c
gcc -g -Wall -c -o file2.o file2.c
gcc -g -Wall -c -o file3.o file3.c
gcc file1.o file2.o file3.o -o a.out
我是 Makefile 的新手。
查询:
我无法解释您如何看待您向我们展示的问题。 要么你上面写的不是你实际使用的,要么你有一个错误的 GNU make 版本。 我无法重现您所看到的行为。
但是,我确信它与此有关:GNU make 有一个内置规则,它知道如何从文件xx
为任何xx
构建xx.out
文件:
# make -p -f/dev/null
...
%.out: %
# recipe to execute (built-in):
@rm -f $@
cp $< $@
如果您将自己的配方注释为显式规则,则 make 将在它知道的模式规则中搜索一个,并找到这个内置的模式规则。
但是,根据您向我们展示的内容,此规则不应匹配:为了使其与a.out
的目标匹配,make 必须找到或知道如何构建目标a
而这似乎并不能得到的。 此外,知道如何构建a
将显示对a.out
的循环依赖。
如果您的 makefile 是:
TARGET = all.out
那么这一切都会很有意义,因为您将拥有:
all : all.out
all.out : file1.o file2.o file3.o
在隐式规则匹配%.out: %
之后,它会像这样扩展:
all : all.out
all.out : all file1.o file2.o file3.o
@rm -f all.out
cp all all.out
所以我假设当你将输出复制到你的问题中时,你改变了它:最好不要这样做。 您应该准确地发布您遇到的问题(并验证您发布的内容仍然存在问题)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.