Узнайте, находится ли библиотека в пути

13

Предполагая, что я хочу проверить, установлена ​​ли библиотека и может ли она использоваться программой. Я могу использовать, ldconfig -p | grep mylibчтобы узнать, установлен ли он в системе. но что если библиотека известна только через настройки LD_LIBRARY_PATH?

В этом случае программа может найти библиотеку, но ldconfigне сможет. Как я могу проверить, находится ли библиотека в комбинированном пути компоновщика?

Я добавлю , что я ищу решение , которое будет работать , даже если я не на самом деле есть программа под рукой (например , программа еще не компилируется), я просто хочу знать , что определенная библиотека существует в ld' с пути.

nbubis
источник
2
Вы можете использовать, ldd <binary>чтобы проверить, все ли связанные библиотеки находятся в пути. Может быть, есть более элегантный способ.
Томас
@ Томас Я думаю, вы должны ответить на ваш комментарий. lddслужит именно этой цели.
lgeorget
1
@Thomas - но что если программа еще не скомпилирована, а эта библиотека нужна для компиляции?
nbubis
@Igeorget - см. Мое редактирование / комментарий
nbubis
@nbubis: когда вам нужна библиотека для компиляции, вы обычно должны использовать LIBRARY_PATHпеременную окружения, которая ищется, например, gccкомпилятором. LIBRARY_PATHПеременная среды также имеет двоеточие отделено список каталогов.
Томас

Ответы:

14

ldconfig может перечислить все библиотеки, к которым у него есть доступ. Эти библиотеки также хранятся в его кеше.

/sbin/ldconfig -v -Nбудет сканировать все обычные пути к библиотекам, перечислять все доступные библиотеки, не восстанавливая кеш (что невозможно, если вы не являетесь пользователем root). Он НЕ учитывает библиотеки в LD_LIBRARY_PATH (в отличие от того, что было сказано в этом посте перед редактированием), но вы можете передать дополнительные библиотеки в командную строку, используя следующую строку:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
lgeorget
источник
ldconfig - это инструмент 1980-х годов, от которого отказались в 1990-х годах. По этой причине ldconfigон не переносим, ​​поскольку он применяется только к реализациям, основанным на a.outдинамическом компоновщике на основе SunOS-4.0 с 1987 года.
schily
Как это помогает перечислять библиотеки, которые есть только в LD_LIBRARY_PATH? Я думаю, я мог бы написать скрипт для его анализа, а затем прочитать его через ldconfig, но это немного похоже на избыточное уничтожение.
nbubis
1
@nbubis, вы всегда можете передать библиотеки в LD_LIBRARY_PATH в ldconfig. Как /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)не слишком излишнее по моему вкусу.
lgeorget
@schily Правда? Насколько я могу судить, он работает с библиотеками ELF довольно хорошо. И он все еще используется, ld.so опирается на кеш, созданный ldconfig.
lgeorget
Люди из Linux взломали старый исходный код компоновщика Sun для поддержки ELF. Новая реализация ELF от Sun удалена ldconfigв соглашении с AT & T, поскольку кэширование компоновщика было слишком чувствительным к ошибкам. ВС позже добавил the tree stooges: moe, lariа в crleкачестве вспомогательных программ для управления ELF.
Шили
2

Глобально заменить (пробел) на :LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
fizwit
источник
2

Вы можете скомпилировать простую тестовую программу с помощью gcc и связать свою библиотеку. Затем вы можете проверить используемые библиотеки с помощью ldd. Я использую что-то вроде этого:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed запрещает компоновщику отбрасывать библиотеку, поскольку символы из библиотеки не используются.

guini
источник