Невозможно скомпилировать SDL / OpenGL программу под MinGW - PullRequest
0 голосов
/ 15 сентября 2018

У меня проблемы с компиляцией примера программы SDL / OpenGL для Windows (с MinGW). Он компилируется без ошибок (хотя и с предупреждениями) в моей виртуальной машине, на которой работает Arch. Проблема, кажется, находится на стадии связывания. Он умирает со многими «неопределенными ссылками на symbol» ошибок. Я компилирую с этой командной строкой:

gcc -L/mingw32/lib -lmingw32 -lSDL2main -lSDL2 -lopengl32 -lglu32 -mwindows -I/mingw32/include/SDL2 -Dmain=SDL_main -o cube -3 cube-3.c

Терминал, с которого я запускаю команду, является 32-битным, поэтому библиотеки соответствуют типу архитектуры. Я проверил, что все библиотеки, на которые есть ссылки, установлены в соответствующих местах

/mingw32/i686-w64-mingw32/lib/libopengl32.a
/mingw32/i686-w64-mingw32/lib/libglu32.a
/mingw32/lib/libSDL2.a
/mingw32/lib/libSDL2main.a
/mingw32/lib/libSDL2.dll.a

Ошибки компоновщика имеют следующую форму:

C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.3.0/../../../../i686-w64-mingw32/bin/ld.exe: C:\msys64\tmp\ccuBYqiv.o:cube-3.c:(.text+0x37): undefined reference to `SDL_RWFromFile

неразрешимые символы

SDL_RWFromFile
SDL_LoadBMP_RW
_imp__glGenTextures@8
_imp__glBindTexture@8
_imp__glTexImage2D@36
_imp__glTexParameteri@12
_imp__glTexParameteri@12
SDL_FreeSurface
SDL_Init
SDL_GetError
SDL_GL_SetAttribute
SDL_GL_SetAttribute
SDL_CreateWindow
SDL_GetError
SDL_GL_CreateContext
SDL_GetError
SDL_GL_SetSwapInterval
_imp__glEnable@4
_imp__glDepthFunc@4
glGenBuffers
glBindBuffer
glBufferData
glGenVertexArrays
glBindVertexArray
glEnableVertexAttribArray
glVertexAttribPointer
glCreateShader
glShaderSource
glCompileShader
glCreateShader
glShaderSource
glCompileShader
glCreateProgram
glAttachShader
glAttachShader
glLinkProgram
_imp__glEnable@4
_imp__glShadeModel@4
_imp__glClearColor@16
_imp__glClearDepth@8
_imp__glEnable@4
_imp__glDepthFunc@4
_imp__glHint@8
_imp__glLoadIdentity@0
_imp__glTranslatef@12
_imp__glRotatef@16
_imp__glBegin@4
_imp__glColor3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glColor3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glColor3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glColor3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glColor3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glColor3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glVertex3f@12
_imp__glEnd@0
_imp__glBegin@4
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glTexCoord2f@8
_imp__glVertex3f@12
_imp__glEnd@0
_imp__glClear@4
glUseProgram
glBindVertexArray
_imp__glDrawArrays@12
SDL_DestroyWindow
SDL_Quit
SDL_StartTextInput
SDL_GetMouseState
SDL_PollEvent
SDL_GL_SwapWindow
SDL_StopTextInput
collect2.exe: error: ld returned 1 exit status

ОБНОВЛЕНИЕ --- Это включенные заголовки в этом порядке

#include <SDL.h>
 #include <SDL_opengl.h>
 #include <GL/glu.h>
 #include <GL/gl.h>

 #include <pthread.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <time.h>

1 Ответ

0 голосов
/ 15 сентября 2018

Так же, как keltar указывает в комментариях, порядок аргументов для gcc неверен. Меняя его на

gcc -o cube-3 cube-3.c -L/mingw32/lib -lmingw32 -lSDL2main -lSDL2 -lglew32 -opengl32 -lglu32 -mwindows -I/mingw32/include/    SDL2 -Dmain=SDL_main

Обратите внимание, что не только часть -o cube-3 cube-3.c смещается в начало, но и lglew32 добавляется непосредственно перед -opengl32 (и после содержимого SDL). Исходный файл должен был ссылаться на GL / glew.h

  /* Note that <GL/glew.h> is included before <GL/glu> */

 #include <GL/glew.h>
 #include <SDL.h>
 #include <SDL_opengl.h>
 #include <GL/glu.h>
 #include <GL/gl.h>

 #include <pthread.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <time.h>
...