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

JoseMaria josemaria.plaza en gmail.com
Mie Mar 7 09:37:25 CET 2012


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




More information about the Jde-developers mailing list