Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda para compilar esto por favor :(

Estas en el tema de Ayuda para compilar esto por favor :( en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 08/07/2008, 14:25
 
Fecha de Ingreso: diciembre-2006
Mensajes: 14
Antigüedad: 17 años, 4 meses
Puntos: 0
Ayuda para compilar esto por favor :(

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.
  #2 (permalink)  
Antiguo 08/07/2008, 21:07
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ayuda para compilar esto por favor :(

Esto pasa porque al definir las funciones en el .h estas se generan en los archivos .o entonces obtienes nivel.o con las funciones del .h y jose.o también con las mismas funciones del .h

Crea un displayer.cpp donde defines las funciones de displayer.h

displayer.h vedría a quedar así:

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 );

void apply_surface( int x, int y, SDL_Surface* origen, SDL_Surface* destino );

#endif
y displayer.cpp

Código:
#include "displayer.h"

SDL_Surface *load_imagen( std::string filename )
{
/*blablabalblaba*/
}

void apply_surface( int x, int y, SDL_Surface* origen, SDL_Surface* destino )
{
    /*blablabalblaba*/
}
luego compilas displayer.cpp, nivel.cpp y jose.cpp

y entonces el programa:
g++ joseT.cpp -o josef nivel.o jose.o displayer.o -lSDL -lSDL_image
  #3 (permalink)  
Antiguo 09/07/2008, 12:32
 
Fecha de Ingreso: diciembre-2006
Mensajes: 14
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Ayuda para compilar esto por favor :(

GRACIAS!! yackcae anda genial.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:53.