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

Julio Vega julio.vega en urjc.es
Vie Mar 6 11:21:55 CET 2009


  Hola de nuevo,

  bueno, pues resulta que después de X horas (no voy a especificar, para 
no lastimar aún más mi autoestima), Jose María en 1 minuto se ha 
percatado que en el fichero "ld.so.conf" las líneas de paths añadidas 
tenían la sintaxis incorrecta. A modo de "Epi-Blas":

  BIEN:

    include /etc/ld.so.conf.d/*.conf
    /usr/lib/jde-robot
    /usr/lib/jde-robot/drivers
    /usr/lib/jde-robot/schemas
    /usr/lib/jde-robot/services

  MAL:

    include /etc/ld.so.conf.d/*.conf
    include /usr/lib/jde-robot

  Bueno, mirémoslo por el lado positivo. Ahora sabemos mucho más de 
librerías dinámicas :)

  Gracias encarecidamente Jose María,

  Julio

Julio Vega wrote:
>  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