为什么要抱怨循环依赖?

Han*_*rén 11 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
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

RBe*_*eig 18

你的隐含规则是罪魁祸首.它们具有以与make如何理解它们相反的顺序列出的扩展名.

.o.c:
Run Code Online (Sandbox Code Playgroud)

告诉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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @Elazar,是的.但最初的问题并非如此.它是关于创建一个makefile,它将依赖关系定义为循环图而不是**非循环**图.关键是要避免循环,我的解决方案是通过避免手动指定已经正确安装和配置的`make`已知的任何东西来做到这一点. (2认同)