Как получить минимальную SDL-программу для компиляции и компоновки в Visual Studio 2008 Express? - PullRequest
7 голосов
/ 28 декабря 2008

Я пытаюсь использовать SDL в C ++ с Visual Studio 2008 Express. Следующая программа компилируется, но не связывается:

#include <SDL.h>

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

Ошибка ссылки:

LINK : fatal error LNK1561: entry point must be defined

Я получаю это независимо от того, как или я связываюсь с SDL.lib и SDLmain.lib. Определение main как main() или SDL_main() дает ту же ошибку, с или без extern "C".

Редактировать: я решил это, не включив SDL.h в main.cpp - рефакторинг, который я сделал независимо от проблемы. Аналогичное решение было бы для #undef main прямо перед определением функции.

Ответы [ 3 ]

6 голосов
/ 28 декабря 2008

В данный момент у меня нет VC ++, но я сталкивался с этой проблемой несколько раз.

Вам нужно создать проект Win32, а не консольный проект. Проект Win32 ожидает функцию WinMain в качестве точки входа в программу. SDLmain.lib содержит эту точку входа, а в заголовочном файле SDL_main.h есть макрос, который преобразует вашу основную функцию в SDL_main. Эта функция вызывается точкой входа в библиотеке SDLmain.

Основная функция должна иметь следующую подпись:

int main(int argc, char *argv[])

Также необходимо включить SDL.h перед объявлением вашей основной функции, и вам нужно связать и SDL.lib, и SDLmain.lib.

Похоже, вы делаете это. Итак, я предполагаю, что у вас есть консольный проект. Следовательно, компоновщик ищет основную функцию для вызова, но он перераспределяется в SDL_main с помощью макроса SDL_main.h . Таким образом, компоновщик не может найти точку входа и сдается!

3 голосов
/ 20 марта 2009

Мне помогло добавить следующие строки перед main ():

#ifdef _WIN32
#undef main
#endif

Немецкая Википедия также предлагает вместо этого добавить следующие строки:

#ifdef _WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif

Хотя у меня все еще были ошибки связи, когда я пытался найти второе решение.

0 голосов
/ 28 декабря 2008

Компоновщик не может найти точку входа. Это означает, что ваша функция main () не распознается как точка входа.

Если у вас есть файл .def, удалите его.

Кроме того, если вы настроили свой проект для компиляции с Unicode, а не как mbcs, вы должны использовать wmain () вместо main ().

...