[Jde-dev] [Jde-users] Problema con enlazado dinámico libreríasJDE

Julio Vega julio.vega en urjc.es
Vie Mar 6 11:03:38 CET 2009


  Hola,

  a este paso vamos a ser los másters de las librerías dinámicas :)

  Sí, claro, he ejecutado el "ldconfig" tras actualizar el "ld.so.conf". 
De hecho es seguramente un problema que no tenga nada que ver con JDE, 
sino de alguna piltrafa en mi sistema (aunque está recién estrenado...). 
Digo esto, porque ayer pude llegar a la solución que expuse en el 
anterior e-mail, tras intentar instalar sin éxito a priori las librerías 
CUDA; y le ocurría el mismo problema de enlazado con sus respectivas 
dependencias.

  Es como si "ldconfig" tuviera un efecto nulo... De hecho, 
"LD_DEBUG=all ./esquema.so" muestra cómo efectivamente el enlazador NO 
está buscando en los paths añadidos al "ld.so.conf".

  Si llego a alguna conclusión lógica ya lo pondré. Mientras, salvo el 
paso con el LD_LIBRARY_PATH :)

  Saludos,

  Julio

JoseMaria wrote:
> Uhm... En general, no sólo para jde, sino para cualquier aplicación en C
> que dependa de bibliotecas, las bibliotecas estáticas se localizan al
> generar el ejecutable (compilar-enlazar) y se empotran en él. Las
> bibliotecas dinámicas por contra no están empotradas en el ejecutable,
> sino que en tiempo de ejecución el enlazador dinámico las encuentra y
> las incorpora.
>
> Al enlazador dinámico (en linux: ld.so) hay que decirle dónde debe ir a
> buscar las bibliotecas dinámicas. El cargador/enlazador dinámico busca
> las bibliotecas dinámicas en (y en este orden):
> 1.- los directorios incluidos en la variable de entorno  LD_LIBRARY_PATH
> 2.- los directorios incluidos en /etc/ld.so.cache
> 3.- ciertos directorios por defecto como  /lib y /usr/lib.
>
> Asi que se le puede indicar que busque mediante:
> 1.- incluir en la variable de entorno LD_LIBRARY_PATH los directorios
> adecuados. Esto depende de la shell concreta. En la bash que utilizo es
> con: 
> "export LD_LIBRARY_PATH=midirectorio1:midirectorio2:$LD_LIBRARY_PATH.
> 2.- /etc/ld.so.cache es un binario, para incluir en él nuevo directorios
> hay que especificar en el fichero /etc/ld.so.conf los directorios donde
> debe buscar las bibliotecas dinámicas y despues ejecutar ldconfig. Al
> ejecutar ldconfig los directorios de /etc/ld.so.conf se incorporan
> a /etc/ld.so.cache
>
> Nuestra aplicación en JDE típicamente consta de varios esquemas,
> servicios y drivers. Todos ellos son plugins (bibliotecas dinámicas) que
> se cargan en tiempo de ejecución, por ejemplo opencvdemo.so,
> graphics_gtk.so, player.so, etc.. Si están en LD_LIBRARY_PATH o
> en /etc/ld.so.cache, el enlazador dinámico los encontrará.
> Adicionalmente, y esto ya sí depende de nuestro código, hemos
> implementando un mecanismo de carga de esquemas, drivers y servicios que
> busca los plugins en los directorios que se le especifican a jde en su
> fichero de configuración (path XXX:YYY:ZZZ:ggg). De modo que se
> localizan y pueden cargar sin estar en LD_LIBRARY_PATH o
> en /etc/ld.so.cache, si sí están en alguno de esos directorios
> especificados en el fichero de configuración de jde.
>
> A su vez cada componente (esquema,servicio,driver) puede depender de
> otras bibliotecas como progeo, colorspaces, pioneer, etc. Estas
> bibliotecas (que son dinámicas) sí deben estar en algún directorio
> localizable por el cargador/enlazador dinámico (es decir contenido en
> LD_LIBRARY_PATH o en /etc/ld.so.cache). Si alguna referencia a
> biblioteca de un esquema no está bien resuelta, es decir, no se
> encuentra la biblioteca que lo implementa, el esquema falla al cargarse.
>
> Para ver de qué bibliotecas depende un ejecutable, un esquema.so o un
> driver.so basta ejecutar "ldd esquema.so" y te dice de qué bibliotecas
> depende y si puede encontrar cada una de ellas.
>
> Julio, ¿has ejecutado ldconfig después de modificar /etc/ld.so.conf para
> incorporar /usr/lib/jde-robot a los directorios en los que busca en
> enlazador dinámico?
>
> JoseMaria
> On Thu, 2009-03-05 at 20:01 +0100, Julio Vega wrote:
>   
>> Bueno,
>>
>>   después de varios combates se ha solucionado el asunto. Poniendo el 
>> path en la variable de entorno |LD_LIBRARY_PATH, de forma que 
>> ||LD_LIBRARY_PATH=/usr/lib/jde-robot y, lo que es más importante, no hay 
>> que olvidar hacer el $export LD_LIBRARY_PATH a continuación.
>>   Lo todavía extraño es que el enlazador dinámico parece que no mira en 
>> el fichero de configuración donde están especificados los paths de 
>> búsqueda por defecto del sistema (/etc/ld.so.conf). Por la naturaleza de 
>> éste, debería mirar primero en lo que tenga temporalmente en 
>> LD_LIBRARY_PATH y después en tal fichero. Pero si no configuro la 
>> variable de entorno, nada de nada; además consultando el debug completo 
>> (con '$LD_DEBUG=all ./esquema.so') veo perfectamente que no busca!
>>
>>   Por otro lado, quizás me equivoque, pero creo que ldconfig sólo se usa 
>> para localizar librerías cuando compilamos el código en la máquina, y no 
>> cuando hacemos la instalación a través de algún binario o similar. 
>> Entonces sí tendría sentido este embrollo.
>>
>>   Seguimos al acecho :) Saludos,
>>
>>   Julio|
>>
>>     


-- 
Julio Vega | http://robotica-urjc.es/jmvega



More information about the Jde-developers mailing list