Я собрал несколько библиотек из исходников, а файлы после make install
находятся в/usr/local/lib
Например, в моем случае у меня есть файл, libodb-2.2.so
который находится в этом каталоге.
Однако, когда я запускаю исполняемый файл, связанный с libodb
, я получаю ошибку: ошибка при загрузке общих библиотек:libodb-2.2.so: cannont open shared object file: No such file or directory.
Означает ли это, что я собрал свой исполняемый файл не правильно? или я должен указать системе, что в папке /usr/local/lib
также могут быть интересные библиотеки ?
Я использую Ubuntu 12.04, ядро Linux 3.2.0-38-generic.
gdb
который помог бы в любом случаеlink
, например, с проблемой. Мне искренне любопытно. Сначала ваше замечание кажется мне не связанным с проблемой. Но я могу ошибаться. Действительно я не знаю достаточноgdb
и загрузки библиотек.Ответы:
Для текущей сессии вы можете
или внести изменения постоянного вы можете добавить
/usr/local/lib
к/etc/ld.so.conf
(или что - то она включает в себя) и запуститьldconfig
как корень.Если у вас все еще есть проблемы, при запуске
ldd [executable name]
вы увидите библиотеки, которые пытаетесь найти, а какие нет.источник
man
страницыldd(1)
«В обычном случае ldd вызывает стандартный динамический компоновщик (см.ld.so(8)
) С установленнойLD_TRACE_LOADED_OBJECTS
переменной среды1
, что заставляет компоновщик отображать зависимости библиотеки. Однако следует помнить, что в некоторых случаях некоторые версииldd
могут . попытаться получить информацию о зависимости, непосредственно выполняя программу Таким образом, вы никогда не должны использоватьldd
на ненадежном исполняемым ., так как это может привести к выполнению произвольного кода безопасной альтернативы при работе с ненадежными исполняемыми файлами является: ...»$ objdump -p /path/to/program | grep NEEDED
"-L
и-rpath
во время компиляции для установки связующего пути поиска и пути поиска во время выполнения для библиотек является правильным способом согласно этому вопросу и ответу.Если вы уже запустили
ldconfig
после создания библиотеки, продолжайте читать. Если нет, сначала прочитайте об ldconfig ./usr/local/lib
может отсутствовать в пути к библиотеке, который использует ldconfig. Вы можете просто сделать это:И материал должен быть добавлен в кеш компоновщика, но, вероятно, лучше правильно добавить путь. Убедитесь, что у вас есть
/etc/ld.so.conf.d
каталог. Если это так, добавьте файл (назовите его «usr-local.conf» или как угодно) и вставьте в него одну строку:Теперь беги
ldconfig
. Если у вас нет каталога ld.so.conf.d, у вас должен быть/etc/ld.so.conf
файл, и вы можете добавить эту строку в конец.источник
/etc/ld.so.conf.d
sudoed ldconfig, чтобы принять его во внимание, и мой исполняемый файл можно запустить прямо сейчас.