2011-11-25 19 views
6

ठीक है, मैं 10 ट्यूटोरियल पढ़ता हूं, लेकिन मुझे हर समय त्रुटियां मिलती रहती हैं, मेरे पास 5 फाइलें हैं, main.cpp class.cpp, class.h और functions.cpp और functions.h। वे सभी अलग-अलग ऑब्जेक्ट्स से फ़ंक्शंस का अर्थ है जिसका अर्थ है कि functions.cpp में फ़ंक्शंस class.cpp से ऑब्जेक्ट्स का उपयोग करता है।मेकफ़ाइल

मेरे makefile के रूप में

CC = g++ -O2 -I./sdl/include -L. 
LIBS = -lm -lSDL -lpthread -ldl 
SRC = main.cpp 
SDLF = SDLfunctions.cpp 
CLASS = classes.cpp 
CLASSH = classes.h 
SDLFH = SDLfunctions.h 

all: main 

main: SDLfunctions.o Classes.o $(SRC) 
    $(CC) -o [email protected] $(SRC) $(LIBS) 

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -o [email protected] $(SDLF) $(LIBS) 

Classes.o: $(CLASS) $(CLASSH) $(SDLF) $(SDLFH) 
    $(CC) -o [email protected] $(CLASS) $(LIBS) 

इस प्रकार मैं मुझे बता रहता है कि यह संदर्भ अपरिभाषित है लग रहा है। मैं क्या खो रहा हूँ?

क्या makefile आउटपुट

/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
/tmp/ccJG6yQA.o: In function `DrawEnemies(SDL_Surface*)': 
SDLfunctions.cpp:(.text+0x3a7): undefined reference to `Enemy::sprite' 
/tmp/ccJG6yQA.o: In function `rysujpociski(int, SDL_Surface*, SDL_Surface*, 
std::vector<AllyBullet, std::allocator<AllyBullet> >&, double)': 
SDLfunctions.cpp:(.text+0x141f): undefined reference to `AllyBullet::sprite' 
/tmp/ccJG6yQA.o: In function `global constructors keyed to width': 
SDLfunctions.cpp:(.text+0x14a7): undefined reference to `Enemy::Enemy()' 
collect2: ld returned 1 exit status 
make: *** [SDLfunctions.o] Error 1 

फ़ाइलों महान संकलन जब मैं उन्हें दृश्य C++ था, तो यह मेरी makefile हो गया है।

+0

कृपया मेक आउटपुट पोस्ट करें। क्या अनिर्धारित संदर्भ? – EFraim

+1

चलते समय आपको निष्पादित आदेश दिखाई देंगे। क्या वे कमांड को संकलित करने के लिए टाइप किए गए कमांड से अलग हैं? – rodrigo

+1

प्रश्न शीर्षक में सुधार करें ताकि यह प्रश्न _describes_, कृपया। –

उत्तर

7

आप वास्तव में कुछ अजीब कर रहे हैं की तरह पहला विकल्प बनाओ। ऑब्जेक्ट फ़ाइलों को संकलित करने के लिए आपको क्या करना चाहिए (-c) और फिर उन्हें एक साथ लिंक करें। यह इस प्रकार दिखाई देगा:

CC = g++ -O2 -I./sdl/include -L. 
LIBS = -lm -lSDL -lpthread -ldl 
SRC = main.cpp 
SDLF = SDLfunctions.cpp 
CLASS = classes.cpp 
CLASSH = classes.h 
SDLFH = SDLfunctions.h 

all: main 

main: SDLfunctions.o Classes.o $(SRC) 
    $(CC) -o [email protected] $(SRC) SDLfunctions.o Classes.o $(LIBS) # you forgot to link 
                 # the object files 

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -o [email protected] -c $(SDLF)  # -c added to compile, not link 

Classes.o: $(CLASS) $(CLASSH) $(SDLF) $(SDLFH) 
    $(CC) -o [email protected] -c $(CLASS)  # -c added to compile, not link 

आप यह कर रहे हैं, वहीं इसे और भी बेहतर अगर आप संकलक main.o अलग से भी है। इसलिए:

CC = g++ -O2 -I./sdl/include -L. 
LIBS = -lm -lSDL -lpthread -ldl 
MAIN = main.cpp 
SDLF = SDLfunctions.cpp 
CLASS = classes.cpp 
CLASSH = classes.h 
SDLFH = SDLfunctions.h 

all: main 

main: SDLfunctions.o Classes.o main.o 
    $(CC) -o [email protected] SDLfunctions.o Classes.o main.o $(LIBS) 

main.o: $(SDLFH) $(MAIN) $(CLASSH) 
    $(CC) -o [email protected] -c $(MAIN) 

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -o [email protected] -c $(SDLF) 

Classes.o: $(CLASS) $(CLASSH) $(SDLF) $(SDLFH) 
    $(CC) -o [email protected] -c $(CLASS) 

भी ध्यान रखें कि मैं $(LIBS) जब -c का उपयोग कर, क्योंकि जोड़ने तो ऐसा नहीं होता है हटा दिया।

+0

आपको बहुत धन्यवाद :) –

2

आपके पास एक टाइपो है। आप $(CLASSESH) का उपयोग कर रहे हैं लेकिन CLASSH घोषित कर रहे हैं।

+0

तय किया गया, लेकिन –

6

आप अपने .o फ़ाइलों को निष्पादन योग्य में जोड़ने का प्रयास कर रहे हैं। संकलन झंडे में एक-सी जोड़ें ताकि यह केवल आपके लिए ऑब्जेक्ट फ़ाइलों को संकलित कर सके।

यह इस

SDLfunctions.o: $(SDLFH) $(SDLF) $(CLASS) $(CLASSH) 
    $(CC) -c -o [email protected] $(SDLF) $(LIBS) 
+0

में मदद नहीं मिली मुझे "g ++: SDLfunctions.o: ऐसी कोई फ़ाइल या निर्देशिका नहीं है" –