Makefile:循环 - 依赖性下降

Makefile: Circular - Dependency dropped

我设计了一个单独编译所有 .c 文件并分别生成 .o 的 Makefile(我认为这是隐式发生的并且工作得很好)。

可执行文件 (.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

注意: 如果第其中有 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. circular - dependency dropped 错误发生了什么?

我无法解释您如何看待您向我们展示的问题。要么你上面写的实际上不是你正在使用的,要么你有一个有问题的 GNU make 版本。我无法重现您所看到的行为。

但是,我确定它与此有关:GNU make 有一个 built-in 规则,知道如何从文件 xx 为任何 xx:

# make -p -f/dev/null
  ...
%.out: %
#  recipe to execute (built-in):
        @rm -f $@
        cp $< $@

如果您将自己的配方作为显式规则注释掉,那么 make 将在它知道的模式规则中搜索一个,它会找到这个 built-in 模式规则。

但是根据您向我们展示的内容,这条规则 不应该 匹配:为了使其与 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

所以我假设当你将输出复制到你的问题时你改变了它:最好不要那样做。您应该 post 正是您所遇到的问题(并确认您仍然遇到 post 编辑的问题)。