Вопрос по unresolved-external, symbol, c++, linker, sdl – нерешенный внешний

7

У меня есть неразрешенная внешняя ошибка символа, которая сводит меня с ума. Короче говоря, у меня есть класс-оболочка для SDL_Surfaces («DgSurface») и класс для загрузки и хранения DgSurfaces («DgSurfaceList»). Проблема со связью возникает при попытке включить файлы DgSurfaceList в мой проект. Вот мои занятия:

Заголовочный файл "DgSurface.h" содержит объявление класса 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

Файл cpp "DgSurface.cpp" содержит определения 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;
}

Этот класс, кажется, работает нормально и работает как положено (однако, как всегда, я открыт для обратной связи :).

& Quot; DgSurfaceList.h & Quot; содержит объявления класса DgSurfaceList:

#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

и, наконец, "DgSurfaceList.cpp" содержит определения 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()

Теперь, если я закомментирую определение DgSurfaceList :: GetImage () в файле cpp, DgSurfaceList, похоже, будет работать нормально и правильно хранить изображения. Более конкретно, ошибка ссылки возникает только тогда, когда я включаю цикл for в вышеупомянутую функцию. Что бы это могло быть?

Другая информация:

Ошибка:

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 "

Среда кодирования: Visual C ++ express 2010

Ваш Ответ

1   ответ
11

ыполнения C. Так что, возможно, вы компилируете в режиме отладки, но ссылаетесь на релизную версию библиотеки. Другая возможность состоит в том, что вы компилируете в режиме выпуска, но определенный макрос вызывает компиляцию отладочной версии std :: list.

Спасибо, я установил свойства -> C / C ++ -> Code Generation -> Runtime Library в Mt Debug DLL и теперь могу компилировать. Я не уверен, почему это так, но посмотрим на это. Frank
Изменение _DEBUG на NDEBUG решило нашу недавнюю головную боль. Спасибо!
У меня также была эта проблема, используя boost и opencv вместе. Существуют возможные объяснения, связанные с флагами _DEBUG или NDEBUG, в моем случае они не влияют на эту проблему. Спасибо вам обоим.

Похожие вопросы