Почему вы жалуетесь на круговые зависимости?

Я создал файл 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

Мой make файл не является сложным, поэтому, надеюсь, кто-то может обнаружить ошибку.

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

Ваши неявные правила являются виновниками. У них есть расширения, перечисленные в обратном порядке того, как они понимаются make.

.o.c:

сообщает, что файлы .c создаются из .o файлов. Поскольку уже существует правило, в котором говорится, что файлы .o созданы из файлов .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. Но это все еще неправильно. Список библиотек после объектов, потому что библиотеки загружаются только для удовлетворения внешних undefined.