2009-03-20 29 views
11

tôi đã xây dựng được một tập tin làm cho dự án của tôi, và nó hoạt động (tất cả mọi thứ biên dịch) nhưng nó mang lại cho các thông báo lỗi khó chịu:Tại sao khiếu nại về phụ thuộc vòng tròn?

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 của tôi là không phức tạp chút nào vì vậy hy vọng ai đó có thể phát hiện các lỗi.

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 

Trả lời

17

Quy tắc ngầm của bạn là thủ phạm. Họ có các phần mở rộng được liệt kê theo thứ tự ngược lại về cách chúng được hiểu bằng cách thực hiện.

.o.c: 

cho biết các tệp .c được tạo từ tệp .o. Vì đã có một quy tắc nói rằng các tệp .o được tạo từ các tệp .c, bạn có một phụ thuộc vòng tròn và do đó các lỗi.

Giải pháp là (hoặc phải là, giả sử một cấu hình hợp lý làm) đơn giản.

Bạn không (thường) cần chỉ định quy tắc của riêng bạn để biên soạn trong các trường hợp thực sự phổ biến, chẳng hạn như nguồn C++. Sẽ đơn giản hơn khi chỉ định một cái gì đó như:

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) 

Điều này cũng có thể giúp bạn tránh được hai lỗi.

  1. Các quy tắc bạn đã viết nói rằng. Nhưng các quy tắc chính xác đã tồn tại trong gần như tất cả các phiên bản thực hiện.

  2. Bạn đã liệt kê các thư viện trước các tệp đối tượng. Điều này hoạt động một cách tình cờ trên một số nền tảng sử dụng các đối tượng định dạng ELF. Nhưng nó vẫn sai. Liệt kê các thư viện sau các đối tượng vì các thư viện chỉ được tải để đáp ứng các phần tử bên ngoài không xác định.

+0

Cảm ơn rất nhiều, đã xóa thông báo phụ thuộc vòng tròn. Tôi đã tìm ra rằng cũng có một biến CXXFLAGS, do đó cũng hoạt động. gcc được sử dụng cho C và g ++ cho C++, như tôi muốn. Nhưng tại sao lại sử dụng "cc" để liên kết? Tôi có phải lo lắng không? –

+0

Vì có khả năng cc là một liên kết đến gcc, và điều đó sẽ ổn. Tôi khá chắc chắn rằng cả gcc và g ++ sẽ liên kết một ứng dụng hỗn hợp tốt. Tuy nhiên, trí tuệ thông thường có nó mà một trình điều khiển trình biên dịch C++ nên được sử dụng thay vì một trình điều khiển C để liên kết mã hỗn hợp. – RBerteig

+0

nhưng có thể sẽ không theo dõi các phụ thuộc. –

Các vấn đề liên quan