xerces-c 2.8: ошибка при загрузке общих библиотек

Я пытаюсь скомпилировать программу, работающую на сервере 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

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
8_0/lib -lxerces-c -I./xml/xerces-c
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
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

Есть предположения ? Я чувствую, что что-то упускаю, но не знаю что.

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


person Tom    schedule 12.11.2009    source источник


Ответы (3)


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

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

person catwalk    schedule 12.11.2009

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

g++ test.cpp -Xlinker -R ./xml/xerces-c
g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
8_0/lib -lxerces-c -I./xml/xerces-c
g++ test.cpp -Wl,-rpath ./xml/xerces-c_2_8_0/lib -lxerces-c -I./xml/xerces-c_2_8_0/include
8_0/include

or

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.

person Nadir SOUALEM    schedule 12.11.2009
comment
Мне не нравится обновлять путь поиска исполняемого файла для этого, поскольку это противоречит цели LD_LIBRARY_PATH. Со страницы Википедии для ссылки rpath: Основным недостатком использования RPATH является то, что он переопределяет настройки LD_LIBRARY_PATH, что делает такие вещи, как запуск предварительно скомпилированного двоичного файла из домашнего каталога пользователя или какого-либо другого местоположения, отличного от значения по умолчанию, трудным или невозможным. Использование RPATH также затрудняет, если не делает невозможным, обновление библиотек без принудительной переустановки всего программного обеспечения, зависящего от библиотек (даже более старых версий). - person Emerick Rogul; 12.11.2009
comment
так что, по-вашему, каждый раз, когда я устанавливаю новую библиотеку, я должен добавлять ее в путь? Так что давайте добавим boost и все остальные общие чертовы библиотеки... - person Nadir SOUALEM; 12.11.2009
comment
Нет. Каждый раз, когда вы создаете новый каталог библиотеки, вы должны добавить новый каталог в LD_LIBRARY_PATH. Но вам не нужно так часто создавать новые каталоги библиотек, поскольку вы можете объединить библиотеки в один стандартный каталог (/usr/local/lib или что-то еще). - person Emerick Rogul; 12.11.2009

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

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

person IanNorton    schedule 13.11.2009