2012-06-27 2 views
5

Проблема в заголовке, я попытаюсь перечислить то, что я уже пробовал и т. Д. Ниже.Компиляция Простая статическая программа OpenGL 4.0 с использованием MinGW, freeglut и glew

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

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

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

Теперь я freeglut в /c/Users/Owner/root/lib/, /c/Users/Owner/root/include/ и так далее. Следующий шаг - это GLEW, мой ребенок проблемы, насколько я могу судить.

Загрузить исходный код от the project site (direct 1.7.0.zip link). Компиляция немного сложнее, мой текущий рецепт получен из вопроса переполнения стека «Building glew on windows with 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/.


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

${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 '[email protected]'.
  4. -lgdi32 добавляется, чтобы исправить ошибку компоновщика: c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '[email protected]'

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

c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0x83e8): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa1b2): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa290): undefined reference to `[email protected]' 

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

#include <GL/glew.h> 
#include <GL/freeglut.h> 

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

Идеи?

+2

Попробуйте добавить -lopengl32 last на строке, чтобы скомпилировать вашу программу и посмотреть, помогает ли она. EDIT: Должно быть, должно быть -lfreeglut_static, как говорит genpfault, я читаю слишком быстро. – Jite

+1

@Jite Это работает! (в минимальном тестовом случае) О.. Пожалуйста, сделайте это ответом, чтобы я мог продвигать и принимать его. Я не могу поверить, что мне удалось пропустить комбинацию GCC args, поскольку я пробовал около 12 различных наборов! Еще лучше, если вы или кто-то другой могли бы предоставить некоторую информацию о _how_, чтобы выбрать порядок библиотеки, отличный от случайных попыток. – nixeagle

+0

Рад, что это сработало! Я думаю, что кто-то еще должен будет объяснить это более глубоко, но из того, что я понимаю, исправьте меня, если я ошибаюсь, это касается затенения, например, если у вас есть две библиотеки, определяющие функцию с тем же именем, последняя связанная будет теневой предшествующий. – Jite

ответ

4

Попробуйте добавить -lopengl32 last на строке, чтобы скомпилировать вашу программу и посмотреть, помогает ли она.

1

Аргумент заказа значим с gcc ссылками.

Попробуйте это:

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

Кроме того, я не думаю, что есть вариант двойного тире --static, просто -static.

И на win32 вам понадобится успешный glewInit() перед вашим указателем функции glEnableVertexAttribArray(). После проверки вашей основной версии и/или расширения, конечно :)

+1

Это добавляет больше жалоб о 'undefined reference to '_wglGetProcAddress @ 4'. Вероятно, должен был упомянуть, что я играл с аргументом. То, что у меня есть в вопросе, - это набор аргументов, который дает наименьшее количество спама GCC. – nixeagle

+0

Кажется, что и '--статическая', и' -статическая' работа. Я использовал '--статический', как вариант longform. – nixeagle

+1

Насколько 'glewInit()' идет, да, я знаю. Я поставил * минимальный * testcase, который создал ошибку компоновщика. Я боялся, если бы я поставил 25 или 50 строк кода на C++, все бы сосредоточились на коде. Уменьшая его до 6 строк, которые приводят к ошибке компоновщика, я, похоже, получил более быстрый и правильный ответ. Btw фактический код отлично работает для меня на linux;). То, что на самом деле решило мою проблему с Windows, переместило '-lopengl32' в конец списка аргументов gcc. Посмотрите мои комментарии ниже вопроса в ответ на Jite. – nixeagle