为什么要抱怨循环依赖?

时间:2009-03-20 06:31:18

标签: makefile

我已经为我的项目构建了一个make文件,它可以正常工作(编译所有内容),但它会给出这些恼人的错误消息:

make: Circular zpr.c <- zpr.o dependency dropped.
gcc -Wall   -c -o zpr.o zpr.c
make: Circular readjpeg.c <- readjpeg.o dependency dropped.
gcc -Wall   -c -o readjpeg.o readjpeg.c
make: Circular readppm.c <- readppm.o dependency dropped.
gcc -Wall   -c -o readppm.o readppm.c
make: Circular SceneNode.cpp <- SceneNode.o dependency dropped.
g++    -c -o SceneNode.o SceneNode.cpp
make: Circular BoundingBoxNode.cpp <- BoundingBoxNode.o dependency dropped.
g++    -c -o BoundingBoxNode.o BoundingBoxNode.cpp
make: Circular GeometryNode.cpp <- GeometryNode.o dependency dropped.
g++    -c -o GeometryNode.o GeometryNode.cpp
make: Circular SceneGraph.cpp <- SceneGraph.o dependency dropped.
g++    -c -o SceneGraph.o SceneGraph.cpp
make: Circular testgraph.cpp <- testgraph.o dependency dropped.
g++    -c -o testgraph.o testgraph.cpp

我的makefile根本不复杂,所以希望有人能发现错误。

GXX=g++
CC=gcc
CFLAGS=-Wall

LIBS=-lGL -lglut -ljpeg

OBJS=helpers.o loadobj.o zpr.o readjpeg.o readppm.o SceneNode.o BoundingBoxNode.o GeometryNode.o SceneGraph.o  testgraph.o
OBJS2=testgraph.o SceneGraph.o GeometryNode.o BoundingBox.o SceneNode.o readppm.o readjpeg.o zpr.o loadobj.o helpers.o
SRCS=testgraph.cpp SceneGraph.cpp SceneNode.cpp

.o.cpp:
    $(GXX) $(CFLAGS) -c $<

.o.c:
    $(CC) $(CFLAGS) -c $<

testgraph: $(OBJS)
    $(GXX) $(LIBS) $(OBJS) -o testgraph

clean:
    rm *.o

1 个答案:

答案 0 :(得分:18)

你的隐含规则是罪魁祸首。它们的扩展名与make的理解顺序相反。

.o.c:

告诉make .c文件是从.o文件创建的。由于已经存在一条规则,即.o文件是从.c文件创建的,因此您具有循环依赖关系,因此存在错误。

解决方案是(或应该是,假设合理配置的make)简单。

您(通常)不需要在非常常见的情况下(例如C ++源代码)指定自己的编译规则。简单地指定类似的东西会更简单:

CFLAGS=-Wall
LOADLIBES=-lGL -lglut -ljpeg

OBJS=helpers.o loadobj.o zpr.o readjpeg.o readppm.o SceneNode.o \
   BoundingBoxNode.o GeometryNode.o SceneGraph.o  testgraph.o 

all: testgraph

testgraph: $(OBJS)

这可能也可以帮助您避免两个错误。

  1. 您写的规则说.o文件是从.c文件创建的,这是向后的.c文件。但几乎所有版本的make中都存在正确的规则。

  2. 您已在目标文件之前列出了库。这在使用ELF格式对象的某些平台上偶然起作用。但它仍然是错误的。在对象之后列出库,因为仅加载库以满足未定义的外部。

相关问题