miércoles, 27 de febrero de 2008

Actualizando Glut

¡Hey! Esto sí está lejos de ser una solución oficial, pero funciona suficientemente bien.

Resulta que algunas personas hemos intentado utilizar la vieja biblioteca GLUT con versiones actuales del Visual Studio, díganse, 2003, 2005 o 2008. En el momento en el que uno intenta compilar alguna aplicación que dependa de GLUT, aparece el siguiente error:

c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : error C2381: 'exit' : nueva definición; __declspec(noreturn) es diferente
c:\documents and settings\...\gl\glut.h(146) : vea la declaración de 'exit'

o una versión en inglés:

C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdlib.h(371) : error C2381: 'exit' : redefinition; __declspec(noreturn) differs
c:\Documents and Settings\Owner\Desktop\FG WIN32 compile\3rdparty\include\GL/glut.h(146) : see declaration of 'exit'

Bueno, resulta que algunas definiciones en stdlib.h han sido actualizadas.

Lo primero que se me ocurrió fue recompilar GLUT, bajándo el código fuente de la liga citada arriba, sin embargo, apareció el mismo error, acompañado de otras advertencias. La solución es simple, hay que modificar la línea 146 de glut.h:

Cambiar:
extern _CRTIMP void __cdecl exit(int);

Por:
extern _CRTIMP __declspec(noreturn) void __cdecl exit(int);

Con esto, en lugar de error, se obtendrá otra advertencia, pero las aplicaciones compilan y corren. (También aparece el error de que no logra instalar glut.lib y glut.h en los directorios indicados, que son del visual studio viejo, pero es pecata minuta, en el peor de los casos se pueden copiar a mano.) Sospecho que incluso basta con hacer esta modificación en glut.h y no es necesario recompilar toda la biblioteca.

Sin embargo ojo, al compilar la biblioteca recuerdo haber visto inclusive advertencias sobre funciones deprecadas, por lo que puede que este parche no dure mucho y haya que hacer una revisión más cuidadosa de glut.

martes, 19 de febrero de 2008

Mesa OpenGL - cannot restore segment prot after reloc

Descargué y compilé Mesa en mi directorio local y quise usarlo localmente, para no afectar lo que ya tenía instalado en el sistema. Todo iba perfecto, hasta que intenté ejecutar uno de los ejemplos: ./gears, tal y como indican las instrucciones bajo "Running the demos". El error que apareció fue el siguiente:

./gears: error while loading shared libraries: /home/[...]/Mesa-7.0.2/lib/libGL.so.1: cannot restore segment prot after reloc: Permission denied

No fue difícil encontrar en la red que este error se debe a SELinux. Lo que tomó un poco más fue encontrar cómo repararlo y resultó extremadamente sencillo. Entrando al directorio lib/ de Mesa, se modifica el contexto de las bibliotecas con el comando siguiente:

chcon -t texrel_shlib_t *.so

Al utilizar ls -lZ, podremos ver el nuevo contexto de las bibliotecas:

lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGL.so -> libGL.so.1
lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGL.so.1 -> libGL.so.1.5.070002
-rwxrwxr-x _______ _______ user_u:object_r:textrel_shlib_t libGL.so.1.5.070002
lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGLU.so -> libGLU.so.1
lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGLU.so.1 -> libGLU.so.1.3.070002
-rwxrwxr-x _______ _______ user_u:object_r:textrel_shlib_t libGLU.so.1.3.070002
...
Después de esto las bibliotecas recién compiladas de Mesa pueden ser utilizadas asignando la variable de ambiente LD_LIBRARY_PATH, tal y como se indica.