web-dev-qa-db-ja.com

ライブラリの場所をバイナリにどのように指定しますか? (Linux)

この質問では特定の例を使用しますが、実際にはこれは、依存ライブラリが見つからないように見えるLinux上のほとんどのバイナリに一般化されます。したがって、ライブラリがないために実行されないプログラムがあります。

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory

lddは問題にいくつかの光を投げかけます:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)

ただし、コロナはインストールされています。

oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so

「不足している」ライブラリを探す場所をバイナリに指示するにはどうすればよいですか?

34
Mala

1回限りの場合は、変数LD_LIBRARY_PATHを、検索するディレクトリのコロンで区切られたリストに設定します。これは、実行可能ファイルのPATHに類似していますが、環境を通じて指定されたディレクトリの後に標準のシステムディレクトリがさらに検索される点が異なります。

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5

ライブラリを標準以外の場所に保持し、それ自体でライブラリを見つけることができないプログラムがある場合は、ラッパースクリプトを記述できます。

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "$@"

標準システムディレクトリのリストは/etc/ld.so.confに保持されます。最近のシステムでは、このファイルに他のファイルを含めることができます。あなたのファイルにinclude /etc/ld.so.conf.d/*.confのようなものが含まれている場合は、追加するディレクトリを含む/etc/ld.so.conf.d/mala.confという新しいファイルを作成します。 /etc/ld.so.confまたはインクルードファイルを変更した後、/sbin/ldconfigを実行して変更を有効にします(これによりキャッシュが更新されます)。

LD_LIBRARY_PATHは、FreeBSD、NetBSD、OpenBSD、Solaris、Tru64を含む他の多くのuniceにも適用されます。HP-UXにはSHLIB_PATHがあり、Mac OS XにはDYLD_LIBRARY_PATHがあります。/etc/ld.so.confにはほとんどのユニックスのアナログですが、場所と構文はより広く異なります。)

LD_LIBRARY_PATHを回避したい場合は、リンク中にこれを行うこともできます。

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...

-Wl、...は、追加のコマンドをリンカーに渡すために使用されます。この場合、-Rを使用して、このパスを.soの「デフォルトの検索パス」として保存するようリンカーに指示します。

私のサイトでは、このような多くの小さなヒントをメモしています。

https://www.thanassis.space/tricks.html

15
ttsiodras

これは、libcoronaが正しいパスにインストールされていないことを示しています。 libcoronaディレクトリを正しいパスに移動すると、問題は解決されます。

0
Rathi