繁体   English   中英

Makefile:循环 - 依赖项已删除

[英]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 的新手。

查询:

  1. 为什么评论行号。 7 导致此问题并取消注释它可以正常工作吗?
  2. 当第 7 行被注释时,第一个输出中的cp是什么?
  3. 循环依赖丢弃错误会发生什么?

我无法解释您如何看待您向我们展示的问题。 要么你上面写的不是你实际使用的,要么你有一个错误的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM