2013-08-31 2 views
3

У меня есть программа, для которой требуется liblog4cpp.Linux - Файл SO не найден

Теперь я хочу, чтобы программа запускалась на другой машине без liblog4cpp. Поэтому я просто нахожу log4cpp.so и перемещаю его в тот же каталог моей программы. Но из-за ошибки докладывал:

ошибка при загрузке разделяемых библиотек: liblog4cpp.so.4: не может открыть общий объектный файл: Нет такого файла или каталога

Могу ли я делать это правильно? Как я могу сказать программе найти SO-файл рядом с ним?

+0

является 'log4cpp.so' только символическую ссылку на' liblog4cpp.so.4'? проверьте с помощью команды 'file log4cpp.so'. – lulyon

ответ

5

Проверьте переменную среды LD_LIBRARY_PATH ... Один из каталогов на пути должен указывать на местоположение вашего файла log4cpp.so; также команда linux ldd удобна для определения того, какие библиотеки общих объектов используются в вашем исполняемом файле. Синтаксис: ldd <executable>.

+2

'ldd log4cpp.so' - более конкретно –

4

export LD_LIBRARY_PATH путь по библиотеке. Эта переменная env работает так же, как переменная PATH. Он может содержать несколько путей, разделенных:.

5

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

ldconfig -l /path/to/lib/liblog4.so.4 

Чтобы добавить его в кэш-памяти загрузчика с помощью следующей команды: ldconfig

Тогда для того, чтобы убедиться, что он был правильно добавлен, запустите это:

ldconfig -v | grep liblog 
2

После добавления общих объектов (или разделяемых библиотек lib*.so* или таких символических ссылок) в системные каталоги, такие как /usr/lib или /lib, известный динамическому компоновщику ld-linux.so(8) (или ld.so) вам необходимо запустить ldconfig(8)

Вы можете добавить их в /usr/local/lib/ но быть уверенным, что /etc/ld.so.conf (или какой-то файл /etc/ld.so.conf.d/*.conf) .mentions этот каталог (и запустить ldconfig после его изменения)

4

в предположении, что путь где .so файл/s доступен в /path вы можете также избежать экспортировать переменную среды и использовать только

LD_LIBRARY_PATH=/path ./myProgram 

берегись тот факт, что если вы делаете:

export LD_LIBRARY_PATH=/path 

вы перезагружаем LD_LIBRARY_PATH одному значению /path и потерять все, что вы добавили, прежде чем к этой переменной окружения. Если вы хотите добавить значение без потери предыдущих

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path 
3

В сценарии гс откуда вы запускаете программу, вы должны установить LD_LIBRARAY_PATH перед запуском приложения. Помните, что .so являются разделяемыми библиотеками, требуется во время выполнения ссылки. Таким образом, он должен быть доступен на стандартном пути, таком как/usr/lib перед запуском. В случае, если он не скопирован в стандартный путь, например,/usr/lib, укажите путь, используя следующее.

export LD_LIBRARY_PATH=<new_path_of_so>:$(LD_LIBRARY_PATH) 

В идеале я бы разместил это .so на стандартном пути, например,/usr/lib. Если он установлен в стандартном пути, то нет необходимости устанавливать вышеуказанный путь. Помните, чтобы сделать вашу программу лучше, поместите новый путь в ldconfig.conf.

Вы можете отлаживать такие ошибки, используя следующее.

$strace <binary_name> 

знать так зависимостями

$ldd <binary_name> 

Для дальнейшего, проверьте ссылку ниже.

http://www.tune2wizard.com/sharedobject-crash/

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