lunes, 13 de abril de 2009

Librerías dinámicas de VTK en OS X

Acostumbrado como estoy al sencillo sistema de librerías compartidas en GNU/Linux, no acabo de entender varios mecanismos que se usan en OS X. Uno es el caso de las librerías dinámicas, las famosas ".dylib".

En teoría el concepto es el mismo que el de las ".so", pero hay cosas que me desesperan. Cuando compilo una aplicación que usa las librerías VTK, al estar instaladas en /usr/local/lib, el maldito sistema no las encuentra. Como llevo tiempo haciendo apaños, os cuento hasta dónde he llegado y si alguien tiene la solución definitiva, por favor que me la cuente antes de que empiece a linkar estáticamente (!!).Por cierto, es indiferente usar cmake que qmake, con automake no he probado pero después de acostumbrarme a los otros dos como que cada vez me da más pereza.

Problema: si compilamos el programa e intentamos lanzarlo desde una terminal, nos escupe diciendo que no puede encontar las librerías libvtk* y sus respectivos símbolos. Si analizamos los links del ejecutable con:

otool -L ejecutable

Obtenemos una bonita lista donde podemos comprobar que las librerías VTK no tienen su correspondiente path.

Después de leer detenidamente un montón de documentación vía web de la que no guardo los links, me entero que a partir de Leopard hay una opción para usar -rpath (runpaths) tanto de forma global como relativa. Bien, recompilo VTK con el RPATH activado (esto tarda un rato)... y no funciona. Genial, es como cuando he intentado compilar en x86_64 y no puedo porque carbon sólo es 32 bits y cocoa me da error con QT 4.5 (!). Si es que sobre el papel todo es muy bonito, pero luego... en fin, vamos a los apaños.

Solución/apaño #1: añadir en .bash_profile una línea para que la carpeta de las librerías VTK esté en el path de búsqueda. Después de un rato de amena lectura, consigo enterarme que en el mac es:

export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/lib/vtk-5.2/

Bien, hecho esto, primera victoria: los ejecutables corren desde la bash. Después de pensar (ingenuo de mí) que estaba todo solucionado, cuando voy a debuggear (toma palabro!) desde Xcode... la misma historia!

Solución-apaño #2: después de trastear un buen rato con la ingente cantidad de opciones de compilación en Xcode, resulta que no es ahí (bravo!). Hay que añadir la variable de entorno en el ejecutable, como os pongo en esta captura:


Bueno, ahora funcionar funciona. Pero miedo me da lanzar shark o alguna otra aplicación de análisis. El caso es que hace tiempo no tuve este problema así que no sé si es un bug de VTK 5.2 o es que soy cada vez más torpe.

¿Alguna idea?

1 comentario:

Anónimo dijo...

He enontrado tu blog porque estoy intentando compilar un proyecto en Qt mediante Qt creator en mac y quiero crear un ejecutabe independiente, es decir que se pueda ejecutar en cualquier mac ya que todas las librerias necesarías se encuentran en el ejecutable. ¿Sabes como hacer eso? Esto poco acostumbrado a Qt y me estoy volviendo loco. He leido que es algo llamado librería estátias, ¿Es cierto? ¿Podrías explicarme paso a paso como hacerlo en mac? No me importa en absoluto si el ejecutable aumenta considerablemente el tamaño.

Gracias