Tengo estas 3 librerias .h, y sus respectivos codigos(en negrita esta lo que realmente interesa para el problema que tengo).
displayer.h
Código:
jose.h#ifndef _displayer_h_ #define _displayer_h_ #include "SDL/SDL.h" #include "SDL/SDL_image.h" #include string //el foro no toma los <> #include "defines.h" SDL_Surface *load_imagen( std::string filename ) { /*blablabalblaba*/ } void apply_surface( int x, int y, SDL_Surface* origen, SDL_Surface* destino ) { /*blablabalblaba*/ } #endif
Código:
jose.cpp#ifndef _jose_h_ #define _jose_h_ #include "SDL/SDL.h" #include "SDL/SDL_image.h" class Cjose{ private: /*blablabalblaba*/ public: /*blablabalblaba*/ };
Código:
nivel.h#include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "jose.h" #include "defines.h" #include "displayer.h" #include iostream //el foro no toma los <> #include string using namespace std; const int INI_VIDAS=3; Cjose::Cjose(){ vidas=INI_VIDAS; activo=true; x=320; y=440; velx = 0; vely = 0; ancho=40; alto=40; } bool Cjose::cargar_imagen(std::string archivo) { /*blablabalblaba*/ } void Cjose::handle_events(SDL_Event event) { /*blablabalblaba*/ } void Cjose::mover(){ /*blablabalblaba*/ } void Cjose::mostrar(SDL_Surface* destino) { apply_surface( x, y, imagen, destino ); } #endif
Código:
nivel.cpp#ifndef _nivel_h_ #define _nivel_h_ #include "SDL/SDL.h" #include "SDL/SDL_image.h" #include string //el foro no toma los <> #include "defines.h" class Cnivel{ private: int numero; SDL_Surface* fondo; int puntos; public: Cnivel(int); //recibe el numero de nivel a cargar void cargar_nivel(); // carga la imagen de fondo y los puntos void mostrar_fondo(); }; #endif
Código:
[/spoiler]#include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "nivel.h" #include "defines.h" #include "displayer.h" #include iostream //el foro no toma los <> #include string using namespace std; Cnivel::Cnivel (int nivel){ numero=nivel; }
Y aca está el programa principal que usa todo
joseT.cpp
[spoiler]
Código:
El problema es que cuando lo compilo (linux) me dice que se redefine la función load_imagen y apply_surface del displayer.h. Eso es supongo porque enlazo al prog principal(joseT.cpp) a jose.cpp y nivel.cpp quienes por separado incluyen a displayer.h y por eso se define 2 veces cada funcion definida en displayer.h y me tira error, por eso es que uso #ifndef y sigue sin darme bolilla.#include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "funciones/jose.h" #include "funciones/nivel.h" #include "funciones/defines.h" #include iostream //el foro no toma los <> #include string using namespace std; SDL_Surface* fondo=NULL; const int FRAMES_PER_SECOND = 20; SDL_Surface *inic(){ /*blablabalblaba*/ } int main( int argc, char* args[] ) { bool quit = false; SDL_Event event; Cjose jose; Cnivel nivel(1); /*blablabalblaba*/ }
¿Cómo hago para compilar el prog principal o programarlo bien para que pueda usar el displayer.h tanto en nivel.cpp como en jose.cpp ?
Lo que hago para compilar es lo siguiente:
Compilo por separado cada archivo
$ g++ -c nivel.cpp
$ g++ -c jose.cpp
Compilo el prog principal
$ g++ joseT.cpp -o josef nivel.o jose.o -lSDL -lSDL_image
ERROR MALVADO:
jose.o: In function `apply_surface(int, int, SDL_Surface*, SDL_Surface*)':
jose.cpp.text+0x2e4): multiple definition of `apply_surface(int, int, SDL_Surface*, SDL_Surface*)'
nivel.o:nivel.cpp.text+0x8e): first defined here
jose.o: In function `load_imagen(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
jose.cpp. text+0x370): multiple definition of `load_imagen(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
nivel.o:nivel.cpp .text+0xe4): first defined here
collect2: ld devolvió el estado de salida 1
Bueno espero haberme explicado y gracias por adelantado.