xerces-c 2.8:ошибка при загрузке общих библиотек
Вопрос
Я пытаюсь скомпилировать программу, работающую на сервере HP UX в Red Hat Linux.
Он использует библиотеку xerces-c для анализа XML-файлов.Компиляция в порядке, но когда я пытаюсь ее запустить, я получаю следующее сообщение
./а.выход:Ошибка при загрузке общих библиотек:libxerces-c.so.28:не может открыть файл общего объекта:Данный файл или каталог отсутствует
Я написал очень простую программу, чтобы попытаться понять, что происходит:
#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;
}
И скомпилировал это так:
g ++ test.cpp -l./xml/xerces-c_2_8_0/lib -lxerces-c -i./xml/xerces-c_2_8_0/include
Удивительно, но файл действительно существует:
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
Есть идеи ?Я чувствую, что что-то упускаю, но не знаю, что.
Заранее спасибо.
Решение
бегать ldd a.out
и посмотрите, сможет ли компоновщик разрешить правильный файл .so.
экспорт LD_LIBRARY_PATH
чтобы включить текущую папку (так же, как переменная PATH) и снова проверьте ldd
Другие советы
Хороший способ сделать то, что вы хотите, это следующий:
g++ test.cpp -Xlinker -R ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
или
g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
Параметры Xlinker или WL позволяют использовать конкретные параметры связывания, вам не нужно модифицировать LD_Library_path
Вам нужно указать библиотеке среды выполнения C, где найти различные символы, которые не компилируются статически в вашем коде и не находятся в обычных расположениях /lib и /usr/lib.
Это можно сделать, добавив путь к вашей общей библиотеке в LD_LIBRARY_PATH.В данном случае это будет то, что вы указали в качестве аргумента -L компилятору.