我已经为我的项目构建了一个 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
你的隐含规则是罪魁祸首。它们的扩展名按照与 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)
这可能还可以帮助您避免两个错误。
您编写的规则表明 .o 文件是从 .c 文件创建的,这是向后的。但正确的规则已经存在于几乎所有版本的 make 中。
您已在目标文件之前列出了库。这在某些使用 ELF 格式对象的平台上是偶然发生的。但这仍然是错误的。在对象之后列出库,因为库只是为了满足未定义的外部而加载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)