Compilación del programa OpenGL 4.0 estático simple usando MinGW, freeglut y glew
El problema está en el título, intentaré enumerar lo que ya probé y así sucesivamente a continuación.
En primer lugar, a mi entender, para usar OpenGL 4.0 en Windows, debe ampliar y / o omitir la biblioteca de Windows predeterminada, ya que solo se distribuye OpenGL 1.1.
Así que tenemos MinGW instalado enC:/MinGW/
. A continuación configuro FreeGLUT descargando eltarball desde elSitio del proyecto. Extraiga y compile ejecutando los makefiles de acuerdo con elinstrucciones con una pequeña adición de--prefix
al./configure
mando.
./configure --prefix=/c/Users/Owner/root/
make all
make install
Ahora tengo freeglut en/c/Users/Owner/root/lib/
, /c/Users/Owner/root/include/
y así. El siguiente es GLEW, mi problema infantil, por lo que puedo decir.
Descargue el archivo fuente deel sitio del proyecto (enlace directo 1.7.0.zip). La compilación es un poco más complicada, mi receta actual se deriva de la pregunta de desbordamiento de pila "La construcción de glew en windows con mingw ". Una forma abreviada se lista a continuación:
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
y debe ejecutarse desde la "raíz" de/path/to/glew-1.7.0/
.
Ahora, con la configuración de las bibliotecas "hecha" (suponiendo que no haya errores ...), la compilación de mi programa simple se realiza con esta línea.
${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32 -I ${ROOTPATH}/include -L ${ROOTPATH}/lib --static
Ahora, para descomponer esto un poco y repasar por qué tengo varios argumentos "extra" y mostrarle los errores y problemas que ya encontré y resolví.
-DFREEGLUT_STATIC
y-lfreeglut_static
se utilizan en lugar de lo normal-lfreeglut
Como queremos una construcción estática aquí. El no hacer esto da errores de vinculador relacionados con freeglut.-DGLEW_STATIC
Se agrega por la misma razón.-lwinmm
Se agrega para corregir el error del enlazador:freeglut_init.c:(.text+0x5d9): undefined reference to '_timeBeginPeriod@4'
.-lgdi32
Se agrega para corregir el error del enlazador:c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '_GetDeviceCaps@8'
Ahora estoy perplejo con el siguiente error del enlazador:
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'
El caso de prueba mínimo que produce este error (main.cpp
) es.
#include <GL/glew.h>
#include <GL/freeglut.h>
int main(int argc, char **argv) {
glEnableVertexAttribArray(0);
}
Ideas?