2011-11-25 14 views
6

Ok, przeczytałem około 10 samouczków, ale ciągle otrzymuję błędy, mam 5 plików, main.cpp class.cpp, class.h oraz functions.cpp i functions.h. Wszystkie te używają funkcji z różnych obiektów, co oznacza, że ​​funkcje w functions.cpp używają obiektów from classes.cpp.Niezdefiniowane odniesienia w pliku Makefile

Moje makefile wygląda następująco

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) 

I ciągle mówi mi, że to jest niezdefiniowane referencje. Czego mi brakuje?

Co makefile wyjścia

/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 

Pliki kompilacji świetne, kiedy miałem je w Visual C++, więc to musi być mój makefile.

+0

Proszę zaklepić wyjście make. Jakie niezdefiniowane referencje? – EFraim

+1

Po uruchomieniu sprawi, że zobaczysz wykonane polecenia. Czy różnią się od poleceń, które możesz wpisać, aby skompilować je ręcznie? – rodrigo

+1

Ulepsz tytuł pytania tak, aby on \ opisał pytanie. –

Odpowiedz

7

jesteś rzeczywiście robi coś dziwnego. Powinieneś skompilować (-c) pliki obiektów, a następnie połączyć je ze sobą. To mogłoby wyglądać następująco:

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 

Podczas tej czynności jest jeszcze lepiej, jeśli kompilator main.o oddzielnie również. Dlatego:

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) 

Należy również pamiętać, że usunąłem $(LIBS) podczas korzystania -c ponieważ łączenie się nie dzieje potem.

+0

dziękuję bardzo :) –

2

Masz literówkę. Używasz $(CLASSESH), ale deklarujesz CLASSH.

+0

naprawiono, ale nie pomogło –

6

Próbujesz połączyć swoje pliki .o do plików wykonywalnych. Dodaj -c do flag kompilacji, aby kompilował tylko dla twoich plików obiektowych.

Sprawiają, że pierwsza opcja jak ten

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

otrzymałem "g ++: SDLfunctions.o: Brak takiego pliku lub katalogu" –

Powiązane problemy