Многочисленные ошибки "Неопределенная ссылка" в MXE и SDL2
Я пытаюсь скомпилировать программу OpenGL, которая использует SDL для создания контекста и загрузки изображений. Когда я компилирую его в Linux, он компилируется и работает без ошибок. Я установил MXE в /opt/mxe и проверил, что каталог SDL2 (который содержит заголовки) находится в /opt/mxe/usr/i686-w64-mingw32.static/include/
в то время как соответствующие библиотеки (libSDL.a
и т. д.) находятся в /opt/mxe/usr/i686-w64-mingw32.static/lib/
,
Включенные заголовочные файлы <SDL2/SDL.h>
а также <SDL2/SDL_image.h>
Я пытаюсь скомпилировать указанную программу, используя
i686-w64-mingw32.static-gcc 5_transformation.c -I/opt/mxe/usr/i686-w64-mingw32.static/include -L/opt/mxe/usr/i686-w64-mingw32.static/lib -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lGLEW -lopengl32 -lm -mwindows
Тем не менее, он дает несколько неопределенных ошибок ссылок: [ http://pastebin.com/JaadTNnv
] 1
Многие из этих ошибок, похоже, связаны с Direct3D и другими, которые я не использую (но SDL2 может, внутренне). Должен ли я ссылаться на них тоже? Я даже делаю это правильно? (На странице MXE нет подробных инструкций).
PS. Этот вопрос или его варианты, кажется, очень популярны в Интернете. Однако я уже следовал их инструкциям. Моя основная функция определяется как int main(int argc, char *argv[])
, Я связываюсь с -lmingw32, -lSDL2main и -mwindows, я убедился, что путь в аргументах GCC верен, я попытался поставить i686-w64-mingw32.static-sdl-config --cflags --libs
а также i686-w64-mingw32.static-pkg-config SDL_image --cflags --libs
в аргументах вместо явного связывания (это просто дало неопределенную ссылку для функций SDL, таких как SDL_GL_CreateContext
а также IMG_Load
и сказал, что Package SDL_image was not found in the pkg-config search path.
).
2 ответа
Я установил MXE в /opt/mxe/
и следующее работало для меня (файл, который я пытался скомпилировать был 5_transformation.c
):
/opt/mxe/usr/bin/i686-w64-mingw32.static-gcc 5_transformation.c -mwindows `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --cflags sdl2` `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --cflags SDL2_image` -lmingw32 -lGLEW -lopengl32 -lm `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --libs sdl2` `/opt/mxe/usr/bin/i686-w64-mingw32.static-pkg-config --libs SDL2_image`
Убедитесь, что путь ко всем исполняемым файлам правильный (gcc
так же как pkg-config
), поставь --cflags
аргумент перед --libs
один, убедитесь, что вы печатаете sdl2
(SDL в небольшом случае) и SDL2_image
(SDL в заглавных буквах), используйте -mwindows
, -lmingw32
и использовать -lopengl32
вместо -lgl
Вы должны использовать pkg-config --cflags sdl2 и pkg-config --libs sdl2, чтобы получить все необходимые вам флаги и библиотеки. (Кстати, не включайте SDL2/SDL.h, а только SDL.h и используйте значения pkg-config --cflags, чтобы установить пути включения, если вы хотите быть более переносимым)
Вместо использования pkg-config вы также можете использовать sdl2-config
Если это также не помогает в вашей настройке - посмотрите на пример sdl2, поставляемый с mxe. Добавьте к нему свой код и попробуйте (пере) скомпилировать sdl2 в mxe, запустив make sdl2 в вашей проверке mxe. ( https://github.com/mxe/mxe/commit/c3624cdefb7ff0c4b69316c7c1b740b97f55e1db)