Проблема в заголовке, я попытаюсь перечислить то, что я уже пробовал и т. Д. Ниже.Компиляция Простая статическая программа 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
Теперь, чтобы разложить это немного и пройти через почему у меня есть различные «дополнительные» аргументы и показать вам, какие ошибки и проблемы, я уже столкнулись и решили.
-DFREEGLUT_STATIC
и-lfreeglut_static
используются вместо нормального-lfreeglut
, как мы хотим статическую сборку здесь. Несоблюдение этого дает ошибки компоновщика, относящиеся к freeglut.-DGLEW_STATIC
добавлено по той же причине.-lwinmm
добавлен для исправления ошибки компоновщика:freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]'
.-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);
}
Идеи?
Попробуйте добавить -lopengl32 last на строке, чтобы скомпилировать вашу программу и посмотреть, помогает ли она. EDIT: Должно быть, должно быть -lfreeglut_static, как говорит genpfault, я читаю слишком быстро. – Jite
@Jite Это работает! (в минимальном тестовом случае) О.. Пожалуйста, сделайте это ответом, чтобы я мог продвигать и принимать его. Я не могу поверить, что мне удалось пропустить комбинацию GCC args, поскольку я пробовал около 12 различных наборов! Еще лучше, если вы или кто-то другой могли бы предоставить некоторую информацию о _how_, чтобы выбрать порядок библиотеки, отличный от случайных попыток. – nixeagle
Рад, что это сработало! Я думаю, что кто-то еще должен будет объяснить это более глубоко, но из того, что я понимаю, исправьте меня, если я ошибаюсь, это касается затенения, например, если у вас есть две библиотеки, определяющие функцию с тем же именем, последняя связанная будет теневой предшествующий. – Jite