Hola a todos, bueno el tema es así:
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:
#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
jose.h
Código:
#ifndef _jose_h_
#define _jose_h_
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
class Cjose{
private:
/*blablabalblaba*/
public:
/*blablabalblaba*/
};
jose.cpp
Código:
#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
nivel.h
Código:
#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
nivel.cpp
Código:
#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;
}
[/spoiler]
Y aca está el programa principal que usa todo
joseT.cpp
[spoiler]
Código:
#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*/
}
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.
¿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.