2012-08-12 23 views
7

Tengo un error de símbolo externo no resuelto que me está volviendo loco. En resumen, tengo una clase de contenedor para SDL_Surfaces ('DgSurface') y una clase para cargar y almacenar DgSurfaces ('DgSurfaceList'). El problema del enlace surge cuando trato de incluir los archivos DgSurfaceList en mi proyecto. Aquí están mis clases:externo sin resolver

El archivo de cabecera "DgSurface.h" contiene la declaración de clase DgSurface:

#ifndef DGSURFACE_H 
    #define DGSURFACE_H 

    #include "SDL.h" 
    #include <string> 

    class DgSurface 
    { 
    public: 

     //Constructor/destructor 
     DgSurface(std::string N, SDL_Surface* I): image(I), name(N) {} 
     DgSurface() {name = ""; image = NULL;} 
     ~DgSurface(); 

     //Copy operations 
     DgSurface(const DgSurface&); 
     DgSurface& operator= (const DgSurface&); 

     //Data members 
     std::string name;  //The name of the image 
     SDL_Surface* image;  //The image 
    }; 

    #endif 

el archivo CPP contatins "DgSurface.cpp" definiciones DgSurface:

#include "DgSurface.h" 
#include "SDL.h" 

//-------------------------------------------------------------------------------- 
//  Constructor 
//-------------------------------------------------------------------------------- 
DgSurface::DgSurface(const DgSurface& other) 
{ 
    //Copy name 
    name = other.name; 

    //Create new SDL_Surface 
    image = SDL_ConvertSurface(other.image, other.image->format, 0); 
} 


//-------------------------------------------------------------------------------- 
//  Destructor 
//-------------------------------------------------------------------------------- 
DgSurface::~DgSurface() 
{ 
    SDL_FreeSurface(image); 
} 


//-------------------------------------------------------------------------------- 
//  Assignment operator 
//-------------------------------------------------------------------------------- 
DgSurface& DgSurface::operator= (const DgSurface& other) 
{ 
    // if same object 
    if (this == &other) 
     return *this; 

    //Copy name 
    name = other.name; 

    //Create new SDL_Surface 
    image = SDL_ConvertSurface(other.image, other.image->format, 0); 

    return *this; 
} 

Esta clase parece funcionar bien y funciona como se espera (sin embargo, como siempre, estoy abierto a comentarios :).

"DgSurfaceList.h" contiene DgSurfaceList declaraciones de clase:

#ifndef DGSURFACELIST_H 
#define DGSURFACELIST_H 

#include "SDL.h" 
#include <list> 
#include <string> 
#include "DgSurface.h" 


class DgSurfaceList 
{ 
    public: 
     //Constructors/destructor 
     DgSurfaceList() {} 
     ~DgSurfaceList() {} 

     //Functions 
     bool AddImage(std::string location, std::string name); 

     //Return Functions 
     SDL_Surface* GetImage(std::string S) const; 

    private: 
     //Data members 
     std::list<DgSurface> imlist; //The list of DgSurfaces 

     //Functions 
     SDL_Surface* LoadImage(std::string filename); 
}; 


#endif 

y finalmente "DgSurfaceList.cpp" contiene las definiciones DgSurfaceList:

#include "SDL.h" 
#include "SDL_image.h" 
#include <list> 
#include <string> 
#include "DgSurface.h" 
#include "DgSurfaceList.h" 


//-------------------------------------------------------------------------------- 
//  Load an image from file 
//-------------------------------------------------------------------------------- 
SDL_Surface* DgSurfaceList::LoadImage(std::string filename) 
{ 
    //Loads an image from file, returns SDL_surface* 
    ... 

} //End:DgSurfaceList::LoadImage() 


//-------------------------------------------------------------------------------- 
//  Add a DgSurface to the list 
//-------------------------------------------------------------------------------- 
bool DgSurfaceList::AddImage(std::string location, std::string name) 
{ 
    //Load the image 
    DgSurface temp(name,LoadImage(location)); 

    //If there was an error in loading the image 
    if(temp.image == NULL) 
     return false; 

    //If everything loaded fine, place a copy into imlist 
    imlist.push_back(temp); 

    return true; 

} //End: DgSurfaceList::AddImage(); 


//-------------------------------------------------------------------------------- 
//  Searches imlist for an image, returns a pointer to a SDL_Surface 
//-------------------------------------------------------------------------------- 
SDL_Surface* DgSurfaceList::GetImage(std::string S) const 
{ 
    std::list<DgSurface>::const_iterator i; 

    //Search imlist for DgSurface of the same name 
    for (i = imlist.begin(); i != imlist.end(); i++) 
    { 
     if (S.compare((*i).name) == 0) 
      return (*i).image; 
    } 

    //Return Null if name not found 
    return NULL; 

} //End:DgSurfaceList::GetImage() 

Ahora, si me comente la DgSurfaceList :: GetImage() definición en el archivo cpp, DgSurfaceList parece funcionar bien y almacenar imágenes correctamente. Más específicamente, el error de enlace solo surge cuando incluyo el bucle for en la función anterior. ¿Qué podría ser?

otra información:

error:

unresolved external symbol __imp___CrtDbgReportW referenced in function "public: class 
DgSurface const & __thiscall std::_List_const_iterator<class std::_List_val<class 
DgSurface,class std::allocator<class DgSurface> > >::operator*(void)const " 

entorno de codificación: Visual C++ Express 2010

Respuesta

11

CrtDbgReport se define en la versión de depuración de la biblioteca de tiempo de ejecución C solamente. Por lo tanto, quizás esté compilando en modo de depuración pero vinculándose con la versión de lanzamiento de la biblioteca. Otra posibilidad es que esté compilando en modo de lanzamiento, pero que alguna macro que ha definido causa la compilación de la versión de depuración de std :: list.

+3

Gracias, establecí Properties-> C/C++ -> Code Generation-> Runtime Library en Mt Debug DLL y ahora puedo compilar. No estoy seguro de por qué esto es así, pero lo investigaré. – Frank

+2

También tuve este problema usando boost y opencv juntos. Hay posibles explicaciones relacionadas con los indicadores _DEBUG o NDEBUG, en mi caso no tienen ninguna influencia sobre este tema. Gracias a los dos. –

+1

Cambiar _DEBUG a NDEBUG resolvió nuestro dolor de cabeza reciente. ¡Gracias! – Jon

Cuestiones relacionadas