2009-11-12 3 views
2

Я пытаюсь скомпилировать программу, запущенную на сервере HP UX в Red Hat Linux.xerces-c 2.8: ошибка при загрузке разделяемых библиотек

Он использует библиотеку 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; 
} 

и скомпилирован так:

г ++ test.cpp -L./xml/xerces-c_2_8_0/lib -lxerces-с -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 

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

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

ответ

6

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

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

+0

спасибо! ldd cant find libxerces-c.so.28 !! – Tom

0

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

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 опции позволяют использовать специальные параметры ссылки, вам не нужно modifiy LD_LIBRARY_PATH

+0

Мне не нравится обновлять путь поиска исполняемого файла для этого, поскольку он идет вразрез с целью LD_LIBRARY_PATH. На странице Wikipedia для ссылки rpath: «Основным недостатком использования RPATH является то, что он переопределяет настройки LD_LIBRARY_PATH, которые делают такие вещи, как запуск прекомпилированной двоичной информации из домашнего каталога пользователя или какого-либо другого нестандартного местоположения, трудно или невозможно. Использование RPATH также затрудняет, если не невозможно, обновление библиотек, не заставляя переустанавливать все программное обеспечение, зависящее от (даже более старых версий) библиотек ». –

+0

Так что, согласно вам, каждый раз, когда я устанавливаю новую библиотеку, я должен добавить ее в путь? Итак, давайте добавим boost и все остальные общие библиотеки damn ... –

+0

№. Каждый раз, когда вы создаете новый каталог библиотек, вы должны добавить новый каталог в LD_LIBRARY_PATH. Но вам не нужно часто создавать новые каталоги библиотек, поскольку вы можете консолидировать библиотеки в одном стандартном каталоге (/ usr/local/lib или у вас есть). –

0

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

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

Смежные вопросы