[Jderobot-dev] Problema portando JDErobot de Autotools a CMake

redouane kachach redo.robot en gmail.com
Mie Mar 7 10:40:14 CET 2012


No sé el caso, pero con lo que cuentas suena a que en la primera vez el
enlazado lo hace bien ya que sino como dice Jose Maria te hubiera fallado
al generar la estatica. Ahora bien, cuando utilizas la biblioteca dinamica
generada para compilar el segundo componente ahi algo te falta ya que es
incapaz de resolver todos los simbolos. Asegurate de que en este paso todos
los simbolos "Undefined" en la biblioteca dinamica se pueden resolver, para
ello las bibliotecas que definen estos simbolos tienen que ser "visibles"
por el compilador, esto creo que lo indicas con la opción
"-L/path/libreria" y con la "-lnombre_lib" indicas las librerias que
quieres utilizar ..

Para ver que librerias esta abriendo el compilador puedes utilizar el
comando "strace" que rastrea todas las llamadas al sistema que hace el
proceso y ver que llamadas "open" esta realizando .. con esto puedes ver
que bibliotecas intenta abrir a la hora de generar tu ejecutable ..

Saludos,
Redo.

2012/3/7 Mikel Gonzalez Baile <m.gonzalezbai en gmail.com>

> Hola a todos,
>
> primero gracias por la ayuda. He probado a lanzar la cadena de compilación
> de nuevo, solo que esta vez en lugar de generar la librería dinámica de
> jderobotice, generarla estática para que me diese el problema durante su
> enlazado.
>
> Pues de esta forma ningún problema, se me genera la librería (compilada y
> enlazada) y durante la compilación posterior de introrob no hay ningún
> problema tampoco, generándose el ejecutable y todo correcto.
>
> ¿Cuándo se trata de librerías dinámicas hay que tener en cuenta algún
> detalle "extra"? Con esto descarto el posible fallo de no indicar bien al
> enlazador donde buscar cabeceras y librerías ya que entiendo que sino
> tampoco se podría haber generado bien de forma estática, o me equivoco?
>
> Un saludo y gracias de nuevo.
>
> Mikel.
>
>
>
> 2012/3/7 JoseMaria <josemaria.plaza en gmail.com>
>
>> Hola Maikel,
>>
>> desconozco la sintaxis de CMake, pero es claramente un problema de
>> enlazado, como dice Redo. Al generar el ejecutable de tu componente
>> introrob éste depende de libjderobotice, y esta biblioteca depende de la
>> biblioteca Gearbox. Como no encuentra la biblioteca Gearbox tienes
>> símbolos sin resolver.
>>
>> Libjderobotice depende de la biblioteca gearbox, por ejemplo en
>> src/libs/jderobotice/context.cpp aparece esta inclusión:
>> #include <gbxsickacfr/gbxiceutilacfr/threadutils.h>
>> Al generar la biblioteca libjderobotice te compila sin problemas, esto
>> significa que encuentra bien las cabeceras de la biblioteca GearBox.
>>
>> Si estuvieras generando la versión estática de la biblioteca
>> libjderobotice (libjderobotice.a) entonces te daría fallo de enlazado
>> (el mismo que te aparece al enlazar para generar el ejecutable
>> introrob), porque en ese caso sí tiene que resolver todos los símbolos
>> en ese momento.
>>
>> Como estás generando la versión dinámica de la biblioteca libjderobotice
>> (libjderobotice.so) entonces no tiene que enganchar en ese momento todos
>> los símbolos de los que esta misma biblioteca depende (por ejemplo los
>> de gearbox), confía en que esto lo resuelva el enlazador dinámico más
>> adelante.
>>
>> Y eso parece que es lo que está fallando cuando quieres generar el
>> ejecutable introrob, que en ese punto tiene que resolver todos los
>> símbolos de los que depende introrob (incluyendo los de libjderobotice,
>> gearbox y otros) y no encuentra los de GearBox. Prueba a incorporar, via
>> CMake al enlazar para generar introrob, los directorios donde está la
>> biblioteca GearBox, para que el enlazador los encuentre.
>>
>> Espero que sirva. Ánimo,
>>
>> JoseMaria
>> On Wed, 2012-03-07 at 07:16 +0100, redouane kachach wrote:
>> > No tengo ni idea del problema que te esta saliendo ... parece ser un
>> > problema de linkado. Los simbolos que dice que faltan son de alguna
>> > componente de gearbox? ( empiezan con gbxiceutilacfr:: ) .. en este
>> > caso yo creo que lo que puedes hacer es comparar los simbolos de la
>> > bibioteca "buena" con la mala ... para ello te podrian servir los
>> > comandos "nm" y el comando "c++filt" este último traduce los simbolos
>> > "raros" que saca el "nm" a una sintaxis más legible que coincide con
>> > los nombres de los metodos ..
>> >
>> >
>> > Saludos,
>> > Redo.
>> >
>> > 2012/3/6 Mikel Gonzalez Baile <m.gonzalezbai en gmail.com>
>> >         Hola a todos,
>> >
>> >
>> >
>> >
>> >
>> >         estoy portando la cadena de compilación de JDErobot de la
>> >         herramienta Autotools a CMake y me estoy encontrando con un
>> >         problema a la hora de generar la librería "jderobotice" a
>> >         partir de los ficheros que hay en el repositorio oficial.
>> >
>> >
>> >         Os dejo el fichero que utilizo para generar dicha librería
>> >         comentando un poco por si alguien no conoce la sintaxis de
>> >         CMake:
>> >
>> >
>> >         include_directories(/usr/include/gearbox)
>> >         add_library (jderobotice SHARED component.cpp context.cpp
>> >         application.cpp componentthread.cpp componentthread.h
>> >         statusImpl.h tracerImpl.h catchutils.cpp subsystemthread.cpp
>> >         interfaceconnect.cpp component.h context.h application.h
>> >         exceptions.h catchutils.h subsystemthread.h interfaceconnect.h
>> >         jderobotice.h) # Crea la librería dinámica a partir de las
>> >         cabeceras y fuentes
>> >
>> >
>> >         TARGET_LINK_LIBRARIES(jderobotice ${ice_LIBRARY_DIRS}) #
>> >         Reglas para el enlazador
>> >         TARGET_LINK_LIBRARIES(/usr/lib/gearbox/libGbxUtilAcfr.so)
>> >         TARGET_LINK_LIBRARIES(/usr/lib/gearbox/libGbxIceUtilAcfr.so)
>> >
>> >
>> >         El caso es que la librería se genera bien, pero cuando la uso
>> >         para compilar un componente, por ejemplo Introrob, me sale el
>> >         siguiente error:
>> >
>> >
>> >
>> /home/mikel/Dropbox/Universidad/PFC/trunk/CMAKE_jderobot/src/libs/jderobotice/libjderobotice.so:
>> undefined reference to `VTT for gbxiceutilacfr::SafeThread'
>> >
>> /home/mikel/Dropbox/Universidad/PFC/trunk/CMAKE_jderobot/src/libs/jderobotice/libjderobotice.so:
>> undefined reference to `vtable for gbxutilacfr::TrivialTracer'
>> >
>> /home/mikel/Dropbox/Universidad/PFC/trunk/CMAKE_jderobot/src/libs/jderobotice/libjderobotice.so:
>> undefined reference to `typeinfo for gbxutilacfr::TrivialTracer'
>> >
>> /home/mikel/Dropbox/Universidad/PFC/trunk/CMAKE_jderobot/src/libs/jderobotice/libjderobotice.so:
>> undefined reference to
>> `gbxutilacfr::TrivialStatus::infrastructureFinalising()'
>> >
>> >
>> >         (omito el resto de la traza ya que es más de lo mismo)
>> >
>> >
>> >         Decir que si utilizo la librería jderobotice que se instala
>> >         por medio del paquete de JDErobot no hay ningún problema, con
>> >         lo que entiendo que el problema está si utilizo la que genero
>> >         yo por medio de mi fichero.
>> >
>> >
>> >         Alguna idea?
>> >
>> >
>> >         Un saludo y gracias!
>> >
>> >
>> >         Mikel.
>> >
>> >         _______________________________________________
>> >         Jde-developers mailing list
>> >         Jde-developers en gsyc.es
>> >
>> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
>> >
>> >
>> >
>> > _______________________________________________
>> > Jde-developers mailing list
>> > Jde-developers en gsyc.es
>> > http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
>>
>> --
>> http://gsyc.es/jmplaza
>> Universidad Rey Juan Carlos
>>
>>
>>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20120307/97765e5b/attachment-0001.htm 


More information about the Jde-developers mailing list