2009-03-20 13 views
11

मैं अपने प्रोजेक्ट के लिए एक मेकअप फ़ाइल का निर्माण किया है, और यह काम करता है (सब कुछ संकलित) लेकिन यह इन परेशान त्रुटि संदेश देता है:सर्कुलर निर्भरताओं के बारे में शिकायत क्यों कर रही है?

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 

उत्तर

17

आपके निहित नियम अपराधी हैं। उनके पास रिवर्स ऑर्डर में सूचीबद्ध एक्सटेंशन हैं जो उन्हें बनाने के द्वारा समझा जाता है।

.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) 

यह आपको दो त्रुटियों से बचने में भी मदद करता है।

  1. आपके द्वारा लिखे गए नियमों का कहना है कि .o फ़ाइलें .c फ़ाइलों से बनाई गई हैं, जो पीछे की ओर हैं। लेकिन सही नियम पहले से ही लगभग सभी संस्करणों में मौजूद हैं।

  2. आपने ऑब्जेक्ट फ़ाइलों से पहले पुस्तकालयों को सूचीबद्ध किया है। यह कुछ प्लेटफार्मों पर दुर्घटना से काम करता है जो ईएलएफ प्रारूप वस्तुओं का उपयोग करते हैं। लेकिन यह अभी भी गलत है। ऑब्जेक्ट्स के बाद लाइब्रेरी सूचीबद्ध करें क्योंकि लाइब्रेरी केवल अपरिभाषित बाहरी को संतुष्ट करने के लिए लोड की जाती हैं।

+0

धन्यवाद बहुत कुछ, जो परिपत्र निर्भरता संदेशों को हटा देता है। मुझे पता चला कि एक CXXFLAGS चर भी था, जिससे यह भी काम करता है। जीसीसी सी के लिए प्रयोग किया जाता है, और सी ++ के लिए जी ++, जैसा कि मैं चाहता हूं। लेकिन यह लिंकिंग के लिए "सीसी" का उपयोग क्यों कर रहा है? क्या मुझे चिंता करनी है? –

+0

चूंकि यह संभव है कि सीसी जीसीसी के लिए एक लिंक है, और यह ठीक होगा। मुझे पूरा यकीन है कि जीसीसी और जी ++ दोनों मिश्रित एप्लिकेशन को ठीक से जोड़ देंगे। हालांकि, पारंपरिक ज्ञान में यह है कि मिश्रित कोड को जोड़ने के लिए सी ड्राइवर के बजाय सी ++ कंपाइलर ड्राइवर का उपयोग किया जाना चाहिए। – RBerteig

+0

लेकिन यह शायद निर्भरताओं का ट्रैक नहीं रखेगा। –

संबंधित मुद्दे

 संबंधित मुद्दे