Xerces-c 2.8: Erreur lors du chargement des bibliothèques partagées
Question
Je suis en train de compiler un programme en cours d'exécution sur un serveur HP UX sur Red Hat Linux.
Il utilise la bibliothèque Xerces-c pour analyser les fichiers xml. La compilation est ok, mais lorsque je tente de l'exécuter, je reçois le message suivant
./ a.out: Erreur lors du chargement partagé Bibliothèques: libxerces-c.so.28: ne peut pas ouvrir le fichier objet partagé: Aucun fichier ou répertoire
J'ai écrit un programme très simple pour essayer de comprendre ce qui se passe:
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/TransService.hpp>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
int main(int argc, char* argv[])
{
return 0;
}
Et compilé comme ceci:
g ++ test.cpp -L./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
Étonnamment, le fichier est en fait là:
lib]$ ls
libxerces-c.a libxerces-c.so.28 libxerces-depdom.a libxerces-depdom.so.28
libxerces-c.so libxerces-c.so.28.0 libxerces-depdom.so libxerces-depdom.so.28.0
Toutes les pensées? Je sens que je me manque quelque chose, mais je ne sais pas quoi.
Merci d'avance.
La solution
run ldd a.out
et voir si l'éditeur de liens peut résoudre le droit .so fichier
LD_LIBRARY_PATH
d'exportation pour inclure le dossier en cours (de la même manière que la variable PATH) et vérifier à nouveau ldd
Autres conseils
la bonne façon de faire ce que vous voulez est la suivante:
g++ test.cpp -Xlinker -R ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
ou
g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
Options Xlinker ou Wl vous permettent d'utiliser des options de liaison spécifiques, vous ne avez pas besoin de modifiy LD_LIBRARY_PATH
Vous devez dire à la bibliothèque d'exécution c où trouver les différents symboles qui ne coûtent pas compilés statiquement dans votre code et ne coûtent pas dans les endroits usualy / lib et / usr / lib.
Vous faites cela en ajoutant le chemin de votre bibliothèque partagée LD_LIBRARY_PATH. Dans ce cas, ce sera ce que vous avez été mise à l'argument -L au compilateur.