2010-07-05 12 views
1

Je suis en train de faire un exemple d'une œuvre de boîte à outils, mais après avoir tapé faire, je suis l'erreur suivante:problème de liaison/version avec libxerces-c

g++ -o taskintro taskintro.o `PKG_CONFIG_PATH=/usr/local/lib/pkgconfig pkg-config orocos-ocl-gnulinux orocos-rtt-gnulinux --libs` 
/usr/bin/ld: warning: libxerces-c-3.0.so, needed by /usr/local/lib/liborocos-rtt-gnulinux.so, not found (try using -rpath or -rpath-link) 
/usr/local/lib/liborocos-rtt-gnulinux.so: undefined reference to `xercesc_3_0::XMLUni::fgXercesContinueAfterFatalError' 
. 
. 
. 
collect2: ld returned 1 exit status 
make: *** [taskintro] Error 1 

Je les versions suivantes installées;

/usr/lib/libxerces-c.so 
/usr/lib/libxerces-c.so.28 
/usr/lib/libxerces-c.so.28.0 
/usr/lib/libxerces-c-3.1.so 

J'ai essayé de faire une liaison symbolique:

ln -s /usr/lib/libxerces-c-3.1.so libxerces-c-3.0.so 

mais rien n'a changé. Je pense que je dois déterminer le chemin du répertoire installé mais je n'ai pas beaucoup d'expérience dans ce problème, donc je serais très heureux si quelqu'un peut m'aider à le découvrir.

Mon makefile est comme ceci;

*OROCOS_TARGET = gnulinux 
OROPATH = /usr/local 
CC = g++ 
LD = ld 
OROFLAGS= -Wall -g `PKG_CONFIG_PATH=${OROPATH}/lib/pkgconfig pkg-config orocos-ocl-${OROCOS_TARGET} orocos-rtt-${OROCOS_TARGET} --cflags` 
OROLIBS = `PKG_CONFIG_PATH=${OROPATH}/lib/pkgconfig pkg-config orocos-ocl-${OROCOS_TARGET} orocos-rtt-${OROCOS_TARGET} --libs` 
all: taskintro 
taskintro.o: TaskIntro.cxx ${OROPATH}/include/rtt/os/fosi.h *.hpp 
    ${CC} -c ${OROFLAGS} $< -o [email protected]* 

Cordialement.

Répondre

0

Le problème est que /usr/local/lib/liborocos-rtt-gnulinux.so est lié à libxerces-c-3.0.so.

Pour voir les chemins d'accès à l'éditeur de liens, recherchez le fichier /etc/ld.so.conf.

1

Vous avez besoin Xerces 3.0, que vous pouvez télécharger et installer à partir http://xerces.apache.org/xerces-c/

liens symboliques aux bibliothèques non-existantes est une pente glissante, mais il est parfois la solution la plus simple (ou même la seule).

Si vous avez de le faire, essayez d'ajouter le répertoire contenant le lien symbolique à la liste des répertoires à rechercher à l'aide drapeau gcc -L comme ceci:

(en supposant que le lien symbolique est dans le répertoire de construction):

g++ -L . -o taskintro taskintro.o `...` 

MISE à jOUR:

En réponse à la question mise à jour, il devrait trouver libxerces-c-3.0.so si c'est dans/usr/local/lib.

Cependant, essayez ceci:

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH 
./taskintro 

et si cela ne fonctionne pas, postez la sortie de ldd -v taskintro

En outre, vous ne devriez pas avoir -L et les plus les liens symboliques lors de la compilation, maintenant que vous avez installé Xerces 3.0. S'il vous plaît essayez de recompiler sans cela.

0

J'ai téléchargé et installé xerces 3.0.Maintenant, il a réussi à compiler, mais l'exécution du fichier de sortie donne ce qui suit:

./taskintro: error while loading shared libraries: libxerces-c-3.0.so: cannot open shared object file: No such file or directory 

J'ai recherché le fichier et l'ai trouvé ici;

/usr/local/lib/libxerces-c-3.0.so 

J'ai essayé à nouveau de créer un lien symbolique vers ce fichier et mis à jour le makefile comme vous le suggérez (pas besoin que je suppose, car il a compilé), mais rien n'a changé.

ln -s /usr/local/lib/libxerces-c-3.0.so libxerces-c-3.0.so 

${CC} -L . -o [email protected] [email protected] ${OROLIBS} 

MISE À JOUR:

commande d'exportation m'a aidé à compiler avec succès. maintenant exécuter le programme semble avoir d'autres problèmes avec malloc.c tels que;

taskintro: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 
Aborted 

Vérifié à partir d'autres forums, mais ne pouvait pas comprendre de quoi il s'agit. Ressemble à un problème avec le programme lui-même, n'a donc aucune idée de la façon de le résoudre.

Gracias quand même.

+0

Oui, cela ressemble à un problème avec le code. –

0

Essayez d'installer la bibliothèque libxerces-c3.0 en tant que votre code fait référence aux bibliothèques de la version 3.0 mais pas aux autres. Utilisez la commande mentionnée ci-dessous pour installer la bibliothèque.

sudo apt-get install libxerces-c3.0