неопределенная ссылка на «WinMain» с компиляцией SDL в собственной среде

Я борюсь со своими первыми шагами в SDL. Я хотел скомпилировать простой тестовый класс, просто включив заголовок SDL2, ничего особенного для запуска:

основной.cpp:

#include <SDL.h>

int main() {
    return 0;
}

Сам main.cpp компилируется нормально: g++ -c main.cpp -ISDL/include

но как только я хочу связать его с SDL2.dll либо с машинным кодом main.o, либо напрямую, я получаю эту ошибку: g++ main.cpp -o sdl_test -I SDL/include -L SDL/lib/x64 -l SDL2 -mwindows g++ -o test main.o -L SDL/lib/x64 -l SDL2 -mwindows

/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../lib/libcygwin.a(libcmain.o): In function `main':
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: Fehler: ld gab 1 als Ende-Status zurück

Дополнительная информация: я использую Cygwin и, очевидно, g++ для компиляции кода C++. Моя ОС — Windows 7 Professional 64Bit SP 1.

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


person Matze    schedule 05.07.2014    source источник
comment
они делают очень неприятные макросы, которые переопределяют main. попробуйте просто #undef main после включения, чтобы убедиться, что это так. если да, то найдите определение в заголовках SDL, где объясняется, как они намеревались отключить это определение, и используйте этот способ SDL, чтобы отключить это дерьмо.   -  person Cheers and hth. - Alf    schedule 05.07.2014
comment
кстати, -mwindows просто указывает подсистему Windows и добавляет некоторые библиотеки импорта Windows API. это не имеет ничего общего с другими вещами, которые не сработали. чтобы получить более подробное представление об этой опции для вашего компилятора, выполните -dumpspecs и отфильтруйте mwindows.   -  person Cheers and hth. - Alf    schedule 05.07.2014
comment
#include <SDL.h> #undef main по-прежнему не работает, но проблема не в заголовке. Как я уже сказал, сам файл прекрасно компилируется с заголовком, но как только я пытаюсь связать их, я получаю это исключение   -  person Matze    schedule 05.07.2014
comment
вывод не следует из посылки. но вы можете просто использовать способ SDL. удалите #undef и добавьте аргументы к main, например: int main( int argc, char* argv[] ). это хорошо работает с макросом SDL.   -  person Cheers and hth. - Alf    schedule 05.07.2014


Ответы (1)


Когда вы используете SDL, ваш main() должен выглядеть как int main(int, char **) (или int main(int argc, char **argv)).

Почему? Потому что где-то внутри кода SDL вы можете найти

int SDL_main(int, char **);

int main(int argc, char **argv)
{
    /*Some stuff.*/

    SDL_main(argc, argv);

    /*Some stuff.*/
}

И затем, внутри SDL.h:

#define main SDL_main
person HolyBlackCat    schedule 05.07.2014
comment
Сынок, все, что мне нужно сделать, это, как предложил @Cheersandhth.-Alf, просто использовать int main( int argc, char* argv[] ) в качестве моей основной функции? - person Matze; 05.07.2014
comment
Да. (Есть и другие решения, но это самое простое.) - person HolyBlackCat; 05.07.2014
comment
Я только что заметил недостаток кодирования в нативном окружении... вариант #undef main как-то работает... но без добавления #undef main #include <SDL.h> //#undef main int main( int argc, char* argv[] ) { return 0; } снова компилируется с ошибками - person Matze; 05.07.2014
comment
Я должен упомянуть, что я не могу найти оператор типа #define main SDL_main внутри SDL.h... Я использую SDL2-devel-2.0.3 - person Matze; 05.07.2014
comment
Удалите этот код #undef, он вам не нужен. ››› i can't find a statement like #define main SDL_main Он находится внутри SDL_main.h. В SDL.h вы можете найти #include <SDL_main.h>. - person HolyBlackCat; 05.07.2014
comment
Теперь я получаю больше ошибок, чем когда-либо прежде :D Warning: corrupt .drectve at end of def file Полная ошибка: pastebin.com/S5EEaPzc - person Matze; 05.07.2014
comment
Итак, вы не можете скомпилировать файл так: #include <SDL2/SDL.h> /*new line*/ int main(int, char **){}? Создайте новый вопрос об этом. - person HolyBlackCat; 05.07.2014
comment
Я могу скомпилировать его с помощью g++ -c main.cpp -I SDL/include, но, наконец, связывание его с dll приводит к тому, что компилятор выдает эту ошибку ... но я сделаю это, спасибо за вашу поддержку :) - person Matze; 05.07.2014