Ошибка загрузки разделяемых библиотек

Я запускаю eclipse на Ubuntu с помощью компилятора g++, и я пытаюсь запустить пример программы, использующей ксероны.

В сборке не было ошибок, но когда я попытался запустить программу, я получил бы эту ошибку:

error while loading shared libraries: libxerces-c-3.1.so: cannot open shared object file: No such file or directory

libxerces-c-3.1.so находится в каталоге /opt/lib, который я включил в качестве библиотеки в eclipse. Файл находится, когда я проверил папку. Когда я выполняю echo $LD_LIBRARY_PATH, также отображается /opt/lib.

Любые идеи о том, где лежит проблема? Благодарю.

Команда ldd libxerces-c-3.1.so выводит следующий результат:

linux-vdso.so.1 =>  (0x00007fffeafff000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00007fa3d2b83000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fa3d2966000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fa3d265f000)
libm.so.6 => /lib/libm.so.6 (0x00007fa3d23dc000)
libc.so.6 => /lib/libc.so.6 (0x00007fa3d2059000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fa3d1e42000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa3d337d000)

Ответы

Ответ 1

Я скопировал все файлы библиотеки из /opt/lib в/usr/lib, и программа теперь работает. Спасибо за ответ.

Ответ 2

Попробуйте запустить ldconfig как пользователь root, чтобы узнать, разрешает ли он проблему.

Ответ 3

Запустите ldd libxerces-c-3.1.so и просмотрите вывод, чтобы узнать, можно ли найти все зависимости.

Ответ 4

Попробуйте установить библиотеку libxerces-c3.1 как. Для установки библиотеки используйте приведенную ниже команду.

 sudo apt-get install libxerces-c3.1

Это работало как прелесть для меня.

Ответ 5

Есть много способов сделать это, большинство из них уже упоминалось здесь. НО вы хотите избежать случайного копирования файлов библиотеки в/из системы. Это легко сделать, поскольку у людей мало фантазии в создании оригинальных уникальных имен для их библиотек.

Итак, есть несколько вещей, о которых нужно подумать:

  • Вам нужны эти файлы, чтобы быть постоянной частью вашей системы?
  • Вам нужно только установить для тестирования и частых обновлений?
  • Вам нужны только их для запуска этой конкретной команды один или два раза?
  • Где расположены ваши родные библиотеки?

Чтобы найти различные места в вашей библиотеке (помимо поиска), посмотрите здесь:

cat /etc/ld.so.conf    
cat /etc/ld.so.conf.d/*

В Linux есть несколько стандартных мест:

/lib            # for base system (don't use this!)
/usr/lib        # for package manger installed apps 
/usr/local/lib  # for user installed apps

Есть много других, но вы, скорее всего, останетесь с /usr/local/lib. Затем вам нужно сообщить своей системе, где можно найти эти библиотеки. Охлажденный системный чувак (кто знает, что он делает) способ сделать это использует ldconfig, однако вы можете делать то, о чем вы сожалеете, если вы допустили ошибку здесь. Самый безопасный способ использования этой команды - использовать флаги -v -n, чтобы сделать команду многословной, и указать, какой каталог библиотеки вам нужно добавить.

sudo ldconfig -v -n /usr/local/lib/your-uber-libs

Готово. Но если вы только хотите что-то проверить, то скорее используйте LD_LIBRARY_PATH непосредственно из командной строки, например:

LD_LIBRARY_PATH=/usr/local/lib/your-uber-libs ./your_uber_command

В качестве альтернативы добавьте следующее к вашему .bashrc script.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/your-uber-libs

Теперь вы можете запустить свою динамически связанную команду.