Ответ 1
Я скопировал все файлы библиотеки из /opt/lib в/usr/lib, и программа теперь работает. Спасибо за ответ.
Я запускаю 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)
Я скопировал все файлы библиотеки из /opt/lib в/usr/lib, и программа теперь работает. Спасибо за ответ.
Попробуйте запустить ldconfig
как пользователь root, чтобы узнать, разрешает ли он проблему.
Запустите ldd libxerces-c-3.1.so
и просмотрите вывод, чтобы узнать, можно ли найти все зависимости.
Попробуйте установить библиотеку libxerces-c3.1 как. Для установки библиотеки используйте приведенную ниже команду.
sudo apt-get install libxerces-c3.1
Это работало как прелесть для меня.
Есть много способов сделать это, большинство из них уже упоминалось здесь. НО вы хотите избежать случайного копирования файлов библиотеки в/из системы. Это легко сделать, поскольку у людей мало фантазии в создании оригинальных уникальных имен для их библиотек.
Итак, есть несколько вещей, о которых нужно подумать:
Чтобы найти различные места в вашей библиотеке (помимо поиска), посмотрите здесь:
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
Теперь вы можете запустить свою динамически связанную команду.