Попытка связать SDL в MinGW G++ с треском провалилась.. :/

Вчера поздно вечером мне стало скучно... и я начал писать небольшую игру типа "Крестики-нолики" на C++ и SDL. Я написал довольно большую часть базовой части игры, но когда я скомпилировал ее для проверки на наличие ошибок, я получил сообщение об ошибке: Неопределенная ссылка на WinMain@16; Итак, «Ааа, просто добавьте -lmingw32 должно помочь!» — подумал я.

g++ main.cpp -o nac.exe -lmingw32 -lSDLmain -lSDL -SDL_image

Теперь он пошел и дал мне это: Неопределенная ссылка на SDL_main;

Я не вижу ничего плохого в том, что я сделал, я попытался переместить -lmingw32 вправо, в середину-влево и в середину-вправо, просто чтобы быть уверенным.. Нада!

Я не думаю, что это будет мой исходный код, но на всякий случай: http://pastebin.com/r7fEAkr4 ТАКЖЕ я думаю, что у меня что-то не получилось с определением массива... но я скоро это исправлю.

Любая помощь приветствуется! Эрклинг


person Erkling    schedule 26.09.2011    source источник


Ответы (1)


Ваша основная функция нуждается в этой точной подписи: int main(int, char**)

person wormsparty    schedule 26.09.2011
comment
Большое спасибо за быстрый ответ. :) Я вижу, что все мои предыдущие игры/приложения теперь имели этот прототип (подпись?)! Еще раз большое спасибо! - person Erkling; 26.09.2011
comment
Чтобы вы понимали, что происходит: C определил, что первая вызываемая функция — это main. Определено, что принимается любой прототип от void main(void) до int main(int, char*). Однако SDL использует неприятный трюк: SDL имеет собственную функцию main и использует: #define main SDL_main. В коде SDL после некоторой обработки он вызывает SDL_main, который вводит ваш код. Поскольку С++ позволяет переопределять функции, определение SDL_main(void) не вызывает никаких проблем, за исключением того, что SDL ищет SDL_main(int, char**), поэтому возникает ошибка. - person wormsparty; 26.09.2011
comment
Ааа! Ясно, это потому, что SDL был запрограммирован на простом C? - person Erkling; 26.09.2011
comment
Не совсем. Когда ваш компилятор видит определение main, он знает, что должен использовать интерфейс C. Однако, когда вы пишете main с #include <SDL/SDL.h>, оно преобразуется в SDL_main. На этот раз он не знает, что должен использовать стандартный интерфейс C, и обрабатывает его как функцию C++ при компиляции с помощью g++, допуская переопределение. Он также переопределяет определение, что основная функция может быть void main(void), поскольку она не знает, что она является основной. Поскольку для него это не функция C, SDL игнорирует ее. Я думаю, что где-то в заголовке SDL_main(int, char*) определен как функция C. - person wormsparty; 26.09.2011
comment
Вы также знаете, что уловка SDL_main в основном здесь из-за Windows, которая имеет определение WinMain, отличное от ANSI main. В Linux main SDL просто вызывает SDL_main, в то время как в Windows существует целая обработка аргументов, так что они одинаковы при передаче в SDL_main. Еще одна причина, по которой я не люблю Windows. - person wormsparty; 26.09.2011
comment
Хорошо, спасибо за информацию. :) Кстати, полностью согласен с вами насчет ненависти к Windows. Обычно я использую FreeBSD или Slackware, но когда я пишу такие вещи, как игры, мне нужен графический интерфейс, поэтому я использую Windows. (По какой-то причине я предпочитаю не использовать графический интерфейс в дистрибутивах BSD/Linux: P) - person Erkling; 26.09.2011