Компиляция простой статической программы OpenGL 4.0 с использованием MinGW, freeglut и glew

Проблема в заголовке, постараюсь ниже перечислить что уже пробовал и тд.

Во-первых, насколько я понимаю, чтобы использовать OpenGL 4.0 в Windows, вы должны расширить или обойти библиотеку Windows по умолчанию, поскольку она поставляет только OpenGL 1.1.

Итак, у нас установлен MinGW по адресу C:/MinGW/. Затем я устанавливаю FreeGLUT, загрузив архив с сайта проекта . Извлеките и скомпилируйте, запустив make-файлы в соответствии с инструкциями с небольшим дополнением --prefixк команде ./configure.

./configure --prefix=/c/Users/Owner/root/
make all
make install 

Сейчас у меня халявка в /c/Users/Owner/root/lib/, /c/Users/Owner/root/include/и так далее. На очереди GLEW, мой проблемный ребенок, насколько я могу судить.

Скачать исходный архив с сайта проекта(прямая ссылка 1.7.0.zip). Компиляция немного сложнее, мой текущий рецепт основан на вопросе о переполнении стека «Построение glew на окнах с помощью mingw ». Сокращенная форма указана ниже:

mkdir lib/
mkdir bin/
gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c
gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32.a src/glew.o
gcc -DGLEW_NO_GLU -DGLEW_MX -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.mx.o -c src/glew.c
gcc -shared -Wl,-soname,libglew32mx.dll -Wl,--out-implib,lib/libglew32mx.dll.a -o lib/glew32mx.dll src/glew.mx.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32mx.a src/glew.mx.o

и должен запускаться из «корня» /path/to/glew-1.7.0/.


Теперь с настройкой библиотек "готово" (при условии отсутствия ошибок... )компиляция моей простой программы выполняется с помощью этой строки.

${G++}  -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32  -I ${ROOTPATH}/include -L ${ROOTPATH}/lib --static

Теперь, чтобы немного разложить это и разобраться, почему у меня есть различные «лишние» аргументы, и показать вам, с какими ошибками и проблемами я уже столкнулся и решил.

  1. -DFREEGLUT_STATICи -lfreeglut_staticиспользуются вместо обычного -lfreeglut, поскольку здесь нам нужна статическая сборка. Несоблюдение этого правила приводит к ошибкам компоновщика, связанным с freeglut.
  2. -DGLEW_STATICдобавляется по той же причине.
  3. -lwinmmдобавлено для исправления ошибки компоновщика:freeglut_init.c:(.text+0x5d9): undefined reference to '_timeBeginPeriod@4'.
  4. -lgdi32добавлено для исправления ошибки компоновщика:c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '_GetDeviceCaps@8'

Теперь я в тупике со следующей ошибкой компоновщика:

c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0x83e8): undefined reference to `_glGetString@4'
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa1b2): undefined reference to `_glGetString@4'
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa290): undefined reference to `_glGetString@4'

Минимальный тестовый пример, выдающий эту ошибку(main.cpp)является.

#include 
#include 

int main(int argc, char **argv) {
  glEnableVertexAttribArray(0);
}

Идеи?

5
задан Community 23 May 2017 в 12:31
поделиться