Makefile: Circular语言 - 依赖性被删除



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

可执行文件(.out)不是从。o文件生成的。

Makefile:

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 all.out

注意:如果行号为0,Makefile将完美地工作并产生完美的结果。

行不。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

我是新手。

查询:

  1. 为什么注释行没有。7造成这个问题,并取消评论工作完美?
  2. 什么是cp在第一个输出中当行号为。7被评论了?
  3. 为什么循环依赖被删除的意思吗?

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

所以我假设当你把输出复制到你的问题时,你改变了它:最好不要这样做。您应该准确地发布您所遇到的问题(并验证您仍然存在您所发布的问题)。

最新更新