c - para - mingw portable
Referencias no definidas a_imp____ glew*funciones con minGW gcc (1)
Estoy tratando de compilar un programa OpenGL relativamente simple usando MinGW en un sistema Win 7 x64, y sigo obteniendo referencias indefinidas a varias de las funciones de GLEW. He configurado las bibliotecas para vincularlas con los programas y he estado buscando en mi lista cualquier biblioteca que pueda estar perdiendo, sin embargo, el resultado del enlazador sigue siendo así:
16:35:50 **** Incremental Build of configuration Debug for project test ****
Info: Internal Builder is used for build
gcc -LD:/DEV/openGL/lib/x86 -LD:/DEV/x86/lib -o test.exe test.o -lfreeglut -lglaux -lglew32s -lglu32 -lglfw3 -lopengl32 -lgdi32
test.o: In function `init'':
E:/Development/C/test/Debug/../test.c:32: undefined reference to `_imp____glewGenVertexArrays''
E:/Development/C/test/Debug/../test.c:33: undefined reference to `_imp____glewBindVertexArray''
E:/Development/C/test/Debug/../test.c:35: undefined reference to `_imp____glewGenBuffers''
E:/Development/C/test/Debug/../test.c:36: undefined reference to `_imp____glewBindBuffer''
E:/Development/C/test/Debug/../test.c:37: undefined reference to `_imp____glewBufferData''
test.o: In function `display'':
E:/Development/C/test/Debug/../test.c:45: undefined reference to `_imp____glewBindVertexArray''
test.o: In function `main'':
E:/Development/C/test/Debug/../test.c:61: undefined reference to `_imp__glewInit@0''
collect2: ld returned 1 exit status
16:35:50 Build Finished (took 675ms)
He intentado con -lglew32 y -lglew32s en varias configuraciones diferentes, pensando que tal vez había definiciones en glew32s que no estaban en glew32, y esto no ayudó. ¿Alguna guía sobre lo que me puede estar perdiendo, o algo que he pasado por alto?
Necesita #define GLEW_STATIC
antes #include "glew.h"
si está utilizando la biblioteca de enlaces estáticos. Continuaría y agregaría una regla a su Makefile para definir este token previo al procesador, en lugar de poner realmente #define ...
en su código fuente.
Esto se menciona en la documentación de instalación para GLEW, por cierto. Pero a juzgar por la cantidad de veces que se formula esta pregunta, puede que no se indique con suficiente claridad.
ACTUALIZAR:
La razón para definir este token es que Microsoft Windows usa un __declspec (...)
especial __declspec (...)
para las importaciones y exportaciones de DLL. Al definir GLEW_STATIC
, le está diciendo al vinculador que use un comportamiento estándar para ubicar los símbolos en su .lib
.
Cuando GLEW_STATIC
no está definido, informa al vinculador que los símbolos de la biblioteca se resuelven en tiempo de ejecución. Pero MSVC necesita saber si está creando exportaciones o buscando importaciones, por lo que hay otro token GLEW_BUILD
que define este comportamiento. Como desea vincular (importar) y no compilar (exportar) GLEW, asegúrese de no definir GLEW_BUILD
.
/*
* GLEW_STATIC is defined for static library.
* GLEW_BUILD is defined for building the DLL library.
*/
#ifdef GLEW_STATIC
# define GLEWAPI extern
#else
# ifdef GLEW_BUILD
# define GLEWAPI extern __declspec(dllexport)
# else
# define GLEWAPI extern __declspec(dllimport)
# endif
#endif
También vale la pena mencionar que no puede usar los archivos .lib
enlace dinámico .lib
y los archivos DLL que se suministran en el sitio web oficial de GLEW. Se compilan usando MSVC; para usar un archivo DLL compilado con MSVC en MinGW, consulte este enlace . La mejor solución es simplemente evitar el uso de la biblioteca de enlaces dinámicos y usar la biblioteca estática.