2011-11-25 21 views
6

Ok, he leído unos 10 tutoriales, pero sigo recibiendo errores todo el tiempo, tengo 5 archivos, main.cpp class.cpp, class.h y functions.cpp y functions.h. Todos usan funciones de diferentes objetos, lo que significa que las funciones de functions.cpp utilizan objetos de classes.cpp.Referencias indefinidas en makefile

Mi makefile se ve de la siguiente manera

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) 

que me dice que ha indefinido referencias. ¿Qué me estoy perdiendo?

¿Qué makefile salidas

/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 

Los archivos de recopilar grandes cuando las tuve en Visual C++, por lo que tiene que ser mi makefile.

+0

Por favor, publique la salida make. ¿Qué referencias indefinidas? – EFraim

+1

Al ejecutar make verás los comandos ejecutados. ¿Son diferentes de los comandos que escribirías para compilarlo manualmente? – rodrigo

+1

Mejore el título de la pregunta para que _describa_ la pregunta, por favor. –

Respuesta

7

que le están haciendo algo extraño. Lo que debe hacer es compilar (-c) los archivos objeto y luego vincularlos. Esto sería así:

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 

Mientras que usted está haciendo esto, es aún mejor si compilador main.o separado también. Por lo tanto:

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) 

También tenga en cuenta que me quita el $(LIBS) cuando se utiliza -c debido a la vinculación no sucede entonces.

+0

muchas gracias :) –

2

Tiene un error tipográfico. Está utilizando $(CLASSESH) pero declaró CLASSH.

+0

corregido, pero no ayudó –

6

Está intentando vincular sus archivos .o a ejecutables. Agregue una -c a los indicadores de compilación para que compile solo para sus archivos de objetos.

lo convierten en la primera opción como esta

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

me sale "g ++: SDLfunctions.o: No existe ningún archivo o directorio" –