xerces-c 2.8: ошибка при загрузке общих библиотек - PullRequest
2 голосов
/ 12 ноября 2009

Я пытаюсь скомпилировать программу, работающую на сервере HP UX в Red Hat Linux.

Он использует библиотеку xerces-c для анализа XML-файлов. Компиляция в порядке, но когда я пытаюсь ее запустить, я получаю следующее сообщение

. / A.out: ошибка при загрузке библиотеки: 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

Есть мысли? Я чувствую, что что-то упускаю, но не знаю что.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 12 ноября 2009

запустите ldd a.out и посмотрите, может ли компоновщик разрешить правильный .so файл

export LD_LIBRARY_PATH, чтобы включить текущую папку (аналогично переменной PATH) и снова проверить ldd

0 голосов
/ 13 ноября 2009

Вы должны указать библиотеке времени выполнения c, где найти различные символы, которые не скомпилированы статически в вашем коде и не находятся в обычных местах / lib и / usr / lib.

Вы делаете это, добавляя путь к вашей общей библиотеке в LD_LIBRARY_PATH. В этом случае это будет то, что вы указали для аргумента -L компилятору.

0 голосов
/ 12 ноября 2009

хороший способ сделать то, что вы хотите, это следующий:

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

...