未解决的外部符号错误(VS2013 Express)

时间:2014-02-07 01:42:11

标签: c++ visual-studio class header-files

我决定进入C ++,我一直在尝试使用SDL,类和头文件。 我这里有一个头文件:

class loaders
{
public:
loaders();
SDL_Surface * load_image(const char imageName[], SDL_PixelFormat *format);
};

此处的CPP文件:

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
//COMMENT
class loaders
{
public:
    loaders()
    {
        if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG)
        {
            std::cout << IMG_GetError();
        }
    }
    SDL_Surface * load_image(const char imageName[], SDL_PixelFormat *format)
    {
        SDL_Surface * returnSurface = nullptr;
        returnSurface = IMG_Load(imageName);
        if (returnSurface != NULL)
        {
            return SDL_ConvertSurface(returnSurface, format, NULL);
        }
        else
        {
            std::cout << "Image load failed." << IMG_GetError() << std::endl;
            return NULL;
        }

    }
};

我知道错误意味着链接器无法找到某些东西,但我不能为我的生活,弄清楚它是什么。它可能很小,所以我认为另一双眼睛会有所帮助。

1 个答案:

答案 0 :(得分:2)

您的实现文件应使用自己的头文件进行类声明。您只需要在loaders.cpp中定义成员函数,如下所示:

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
#include "loaders.h"

loaders::loaders()
{
    if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG)
    {
        std::cout << IMG_GetError();
    }
}

SDL_Surface * loaders::load_image(const char imageName[], SDL_PixelFormat *format)
{
    SDL_Surface * returnSurface = nullptr;
    returnSurface = IMG_Load(imageName);
    if (returnSurface != NULL)
    {
        return SDL_ConvertSurface(returnSurface, format, NULL);
    }
    else
    {
        std::cout << "Image load failed." << IMG_GetError() << std::endl;
        return NULL;
    }
}

在项目中包含此实现文件,并使用相同的标志(默认情况)编译项目中的所有源代码。然后编译器将对构造函数的所有引用使用相同的调用约定和名称修饰,并且当链接器将所有目标文件放入可执行文件时,链接器将找到该符号。