0

Всем привет. Решил сделать проект с SDL2.0.9. Я подключил всё правильно, учёл разрядность, подсистема - консоль. Но проект всё равно выдаёт ошибки LINK2019:

Ошибка LNK2019 ссылка на неразрешенный внешний символ _SDL_Init в функции _SDL_main PREngine D:\VisualStudioProjs\PREngine\PREngine\Main.obj 1
Ошибка LNK2019 ссылка на неразрешенный внешний символ _SDL_GetError в функции _SDL_main PREngine D:\VisualStudioProjs\PREngine\PREngine\Main.obj 1
Ошибка LNK2019 ссылка на неразрешенный внешний символ _main в функции "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) PREngine D:\VisualStudioProjs\PREngine\PREngine\MSVCRTD.lib(exe_main.obj) 1
Ошибка LNK1120 неразрешенных внешних элементов: 2 PREngine D:\VisualStudioProjs\PREngine\Debug\PREngine.exe 1

Вот код:

#include <iostream>

#include <SDL.h>

int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        std::cout << "SDL could not initialise! SDL Error: " << SDL_GetError() << std::endl;
    }

    return EXIT_SUCCESS;
}

Никакой из известных способов решения проблемы не помогает. Как можно это исправить?

1 Answers1

1

Это особо хитрые программисты пытаются прогнуть все под себя. Если посмотрите в SDL_main.h, то обнаружите такую строку:

#define main SDL_main

и Ваш main превращается в SDL_main. Естественно, линковщик ничего не может найти, он ведь ищет main для "подсистема - консоль.". Что же делать?

"Правильный быстрый способ":

#include <SDL.h>
#undef main

теперь оно будет как нужно.

Второй способ - использовать WinMain и подсистему windows.

Ещё один способ, вроде как рекомендованный sdl командой, что бы обойти их же багу:

#define SDL_MAIN_HANDLED
#include "SDL.h"

(по этой ссылке пишут о SDL_Init, который в вопросе упоминается. Посмотрите пример на https://wiki.libsdl.org/SDL_SetMainReady , что бы понять, что и куда писать)

И потом все таки убедится, что все линкуется или пойти и почитать известный супер-вопрос-дубликат

P.S. многие думают, что они знают макросы и как лучше... не у всех это получается.

KoVadim
  • 112,121
  • 6
  • 94
  • 160
  • Вообще-то линкер ругается на SDL_Init SDL_GetError и _main что говорит о том, что ОП вообще не линкует библиотеки sdl. Если бы тут была загвоздка только в main, то было бы как в https://ru.stackoverflow.com/questions/757995/%d0%9f%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%ba%d0%be%d0%bc%d0%bf%d0%b8%d0%bb%d1%8f%d1%82%d0%be%d1%80-%d0%b2%d1%8b%d0%b4%d0%b0%d0%b5%d1%82-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d1%83-c – user7860670 Apr 15 '20 at 09:10
  • давайте послушаем автора вопроса. Думаю, там ещё есть что то, что мы не знаем – KoVadim Apr 15 '20 at 09:15