2014-02-07 5 views
0

Я решил попасть на C++, и я экспериментировал с SDL, классами и файлами заголовков. У меня есть заголовочный файл здесь:Неразрешенная внешняя ошибка символа (VS2013 Express)

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

И СРР файл здесь:

#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; 
     } 

    } 
}; 

Я знаю, что ошибка означает, что компоновщик не может найти что-то, но я не могу для жизнь меня, выяснить, что это такое. Это, наверное, что-то маленькое, поэтому я подумал, что другая пара глаз поможет.

+0

Какая ошибка? –

+0

Ошибка ошибка LNK2019: неразрешенный внешний символ "public: __thiscall loaders :: loaders (void)" (?? 0loaders @@ QAE @ XZ), на которые ссылается функция "public: __thiscall Window :: Window (void)" (? ? 0Window @@ QAE @ XZ) \t C: \ Users \ Kevin \ Source \ Workspaces \ SDL Checkers \ SDL Checkers \ SDL Checkers \ main.obj \t SDL Checkers – MadDoctor5813

ответ

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

Включите этот файл реализации в проекте, и собрать все источники в проекте с теми же флагами (случай по умолчанию). Затем компилятор будет использовать одно и то же соглашение о вызовах и украшение имен для всех ссылок на ваш конструктор, а символ будет найден компоновщиком, когда он объединяет все ваши объектные файлы в исполняемый файл.

Смежные вопросы