SDL2: LNK1561: точка входа должна быть определена

Я хочу скомпилировать этот код:

#include <SDL.h>

int main(int argc, char* argv[]) {
    return 0;
}

Но он не может быть связан: Error 1 error LNK1561: entry point must be defined

В этой библиотеке есть какой-то странный код: http://hg.libsdl.org/SDL/file/75726efbf679/include/SDL_main.h

#define main    SDL_main

Также я добавил SDL2.lib;SDL2main.lib в Project Settings = > Linker = > Input.

Что я могу сделать для запуска этого проекта?
VS 2012 SP3, пустой проект на С++.

Ответы

Ответ 1

вот что я нашел здесь:

Щелкните правой кнопкой мыши по имени проекта → Свойства → Развернуть вкладку Linker → System → SubSystem: убедитесь, что это консоль (/SUBSYSTEM: CONSOLE)

Ответ 2

Я обнаружил, что настройка /SUBSYSTEM: CONSOLE - это только половина решения. Вторая половина - добавить SDL_MAIN_HANDLED к вашим дополнительным определениям. Ключ, который я использовал для решения этой проблемы, можно найти в SDL_main.h. Установка SDL_MAIN_HANDLED сообщит файлы заголовков SDL, которые вы уже предоставили main, и не хотите переопределять свою собственную точку входа.

Ответ 3

Как пишет tinky_winki

Щелкните правой кнопкой мыши на имени проекта → Свойства → Развернуть вкладку Линкера → System → SubSystem: убедитесь, что это консоль (/SUBSYSTEM: CONSOLE)

Но если вы не ожидаете, что консоль с окном просто используется, /SUBSYSTEM: WINDOWS

Ответ 4

НЕ #undef main! в то время как его очень плохая практика на стороне SDL, чтобы переопределить ее, у них есть веские причины: WinMain определен на стороне библиотеки и используется для запуска кода инициализации, что помогает в проблемах совместимости. (даже больше при использовании различных SDL-реализаций, таких как Steam или перенос на другие платформы, такие как Android)

Так что вы должны делать? Когда в Windows вы всегда должны включать SDL2main.lib до SDL2.lib и убедитесь, что ваш основной файл находится в формате:

int main(int argc, char* argv[]) // CORRECT
void main(int argc, char* argv[]) // WRONG
int main(int, char**) // MAY BE CORRECT

Источник: SDL2 FAQ по Windows