ライブラリがインストールされており、プログラムで利用可能かどうかをテストしたいとします。これを使用して、ldconfig -p | grep mylib
システムにインストールされていることを確認できます。しかし、ライブラリがその設定でのみ知られている場合はどうなりますかLD_LIBRARY_PATH
?
この場合、プログラムはライブラリを見つけることができますが、ldconfig
実際には見つかりません。ライブラリがあるかどうかを確認する方法結合されたリンカーパス?
実際には、プログラムがなくても(たとえば、コンパイルされていない場合など)、動作できるソリューションを探していることに加えてください。ただld
「存在するいくつかのライブラリ」へのパスを知りたいです。中」。
答え1
ldconfig
アクセスできるすべてのライブラリを一覧表示できます。これらのライブラリはキャッシュにも保存されます。
/sbin/ldconfig -v -N
すべての共通ライブラリパスがキャプチャされ、キャッシュを再構築せずに利用可能なすべてのライブラリを一覧表示します(root以外のユーザーの場合は不可能です)。 LD_LIBRARY_PATHのライブラリは考慮しませんが(この記事で編集する前に言ったのとは対照的に)、次の行を使用して他のライブラリをコマンドラインに渡すことができます。
/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
答え2
gccを使って簡単なテストプログラムをコンパイルし、ライブラリをリンクすることができます。その後、lddを使用して使用されているライブラリを確認できます。私は次のようなものを使用します:
echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib
-Wl,--no-as-needed
そのシンボルが使用されないため、リンカがライブラリを削除するのを防ぎます。
答え3
次のスクリプトを実装しました。ここ:
#!/usr/bin/env python3
"""
Like `type` but for libs.
"""
from __future__ import print_function
from argparse import ArgumentParser
from glob import glob
import sys
import os
def parse_ld_conf_file(fn):
paths = []
for l in open(fn).read().splitlines():
l = l.strip()
if not l:
continue
if l.startswith("#"):
continue
if l.startswith("include "):
for sub_fn in glob(l[len("include "):]):
paths.extend(parse_ld_conf_file(sub_fn))
continue
paths.append(l)
return paths
def get_ld_paths():
# To be very correct, see man-page of ld.so.
# And here: http://unix.stackexchange.com/questions/354295/what-is-the-default-value-of-ld-library-path/354296
# Short version, not specific to an executable, in this order:
# - LD_LIBRARY_PATH
# - /etc/ld.so.cache (instead we will parse /etc/ld.so.conf)
# - /lib, /usr/lib (or maybe /lib64, /usr/lib64)
LDPATH = os.getenv("LD_LIBRARY_PATH")
PREFIX = os.getenv("PREFIX") # Termux & etc.
paths = []
if LDPATH:
paths.extend(LDPATH.split(":"))
if os.path.exists("/etc/ld.so.conf"):
paths.extend(parse_ld_conf_file("/etc/ld.so.conf"))
else:
print('WARNING: file "/etc/ld.so.conf" not found.')
if PREFIX:
if os.path.exists(PREFIX + "/etc/ld.so.conf"):
paths.extend(parse_ld_conf_file(PREFIX + "/etc/ld.so.conf"))
else:
print('WARNING: file "' + PREFIX + '/etc/ld.so.conf" not found.')
paths.extend([PREFIX + "/lib", PREFIX + "/usr/lib", PREFIX + "/lib64", PREFIX + "/usr/lib64"])
paths.extend(["/lib", "/usr/lib", "/lib64", "/usr/lib64"])
return paths
def main():
arg_parser = ArgumentParser()
arg_parser.add_argument("lib", help="Name of the library (e.g. libncurses.so)")
args = arg_parser.parse_args()
paths = get_ld_paths()
for p in paths:
fn = "%s/%s" % (p, args.lib)
if os.path.exists(fn):
print(fn)
return
print("Did not found %r in %r." % (args.lib, paths), file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
答え4
$ gcc --print-file-name=libqdbm.so
/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libqdbm.so