xerces-c 2.8: error al cargar las bibliotecas compartidas
Pregunta
Estoy intentando compilar un programa que se ejecuta en un servidor HP UX en un sombrero rojo Linux.
Utiliza la biblioteca xerces-c para analizar archivos XML. Compilación está bien, pero cuando intento ejecutarlo, me sale el siguiente mensaje
./ a.out: error durante la carga compartida bibliotecas: libxerces-c.so.28: no puede abrir el archivo objeto compartido: No existe el fichero o directorio
Me escribió un programa muy simple para tratar de entender lo que está pasando en:
#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;
}
Y compilado de esta manera:
g ++ test.cpp -lxerces-c -L./xml/xerces-c_2_8_0/lib -I./xml/xerces-c_2_8_0/include
Sorprendentemente el archivo es en realidad existe:
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
¿Alguna idea? Siento que estoy perdiendo algo, pero no sé qué.
Gracias de antemano.
Solución
ejecutar ldd a.out
y ver si el enlazador puede resolver el derecho de presentar .so
LD_LIBRARY_PATH
exportación para incluir la carpeta actual (de la misma manera como la variable PATH) y compruebe de nuevo LDD
Otros consejos
la buena manera de hacer lo que quiere es la siguiente:
g++ test.cpp -Xlinker -R ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
o
g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
Xlinker o Wl opciones le permiten utilizar opciones de enlaces específicos, que no es necesario modifiy LD_LIBRARY_PATH
Es necesario contar la biblioteca de tiempo de ejecución C dónde encontrar los distintos símbolos que enviaban compilado estáticamente en el código y enviaban en el usualy / lib y / usr / lib ubicaciones.
Esto se hace mediante la adición de la ruta de la biblioteca compartida a LD_LIBRARY_PATH. En este caso, esto será lo que has estado posponiendo para el argumento -L para el compilador.