“which”相当于共享库

“which”相当于共享库

我正在寻找一个与 的行为方式相同的实用程序which,但要在 $LD_LIBRARY_PATH 中定义的目录中查找共享库 (*.so)?

答案1

如果您有一个可执行文件并且想查看它在哪里获取库,请运行

ldd /path/to/executable

这将考虑默认搜索路径上的库以及此可执行文件中的库路径如果有的话。

在 Linux 上,系统库的路径会被缓存以提高效率。/sbin/ldconfig -p显示缓存的内容(它存储在/etc/ld.so.cache)。这是显示图书馆位置的脚本:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  set -f
  IFS=:
  for d in $LD_LIBRARY_PATH; do
    if [ -e "$d/$1" ]; then echo "$1"; fi
  done
fi
/sbin/ldconfig -p |
awk -v needle="$1" '$1 == needle {sub(/.* => /, ""); print}'

答案2

如果您的库已正确缓存,您应该能够通过以下方式找到它:

ldconfig -p|grep "yourlibrary"

如果您搜索发行版附带的库,您可以使用在包中搜索文件的发行版方法。

  • zypper wp "*/library.so"(SLES 和 OpenSuSE)
  • yum 提供“*/library.so”(RedHat 及其克隆)

这还将输出未安装但属于活动安装源一部分的 rpm。

答案3

如果您正在寻找一个像gcc's -lLIBNAMEflag 一样工作的实用程序,它会查找名为 then 的文件libLIBNAME.so,那么您可能可以使用一个小脚本来执行如下操作:

#!/bin/sh
ldpath="${LD_LIBRARY_PATH:-$(</etc/ld.so.conf)}"
notfound=1
for libdir in ${ldpath//:/ }; do
        (test -f "$libdir/lib${1}.so" && echo "$_") && notfound=0
done
[ "$notfound" -eq 0 ]

相关内容