2011-11-25 32 views
6

Tamam, yaklaşık 10 öğreticiyi okuyabiliyorum, ancak her zaman hata alıyorum, 5 dosyam var, main.cpp class.cpp, class.h ve functions.cpp ve functions.h. Bunların hepsi fonksiyonlar işlevler.cpp class.cpp gelen nesneleri kullanır anlamına gelen farklı nesnelerden kullanır. Ben başvuruları tanımlanmamış olduğunu söyleyip duruyorMakefile'de tanımlanmamış referanslar

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) 

şöyle

My makefile görünüyor. Neyi kaçırıyorum? i Visual C++ ile onları varken

Ne makefile çıkışları

/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 

dosyalar harika derlemek, bu yüzden benim makefile olmak zorunda.

+0

Lütfen çıktıyı gönderin. Ne tanımlanmamış referanslar? – EFraim

+1

Çalıştırırken, çalıştırılan komutları göreceksiniz. El ile derlemek için yazdığınız komutlardan farklı mı? – rodrigo

+1

Soru başlığını, sorunun _describes_ olması için geliştirin lütfen. –

cevap

7

gibi ilk seçenek olun. Yapmanız gereken şey (-c) nesne dosyalarını derlemek ve sonra bunları birbirine bağlamaktır. Bu şuna benzer:

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 

bunu yapıyorsun da, eğer derleyici main.o ayrı da daha iyi. Bu nedenle:

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) 

Ayrıca bağlama sonra olmaz çünkü -c kullanırken $(LIBS) kaldırıldı unutmayın.

+0

çok teşekkür ederim :) –

2

Yazım hatası var. $(CLASSESH) kullanıyorsunuz, ancak CLASSH bildirildi.

+0

düzeltildi, ancak –

6

.o dosyalarınızı yürütülebilir dosyalara bağlamaya çalışıyorsunuz. Derleme bayraklarına a -c ekleyin, böylece yalnızca sizin nesne dosyalarınızı derler.

Bunu gerçekten garip bir şey yapıyorsun bu

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

yardımcı olmadım "g ++: SDLfunctions.o:" Böyle bir dosya veya dizin yok " –