私のシステムでPostgis拡張機能を動作させようとしていますが、常に "$libdir/postgis2.2" no such file or Directory エラーが発生します。好奇心に「ldd postgis-2.2.so」を実行したところ、次のように出力されました。
linux-vdso.so.1 => (0x00007ffff3bc8000)
/usr/lib64/libjemalloc.so.1 (0x00002b3fe5ff4000)
libgeos_c.so.1 => not found
libproj.so.9 => not found
libjson-c.so.2 => not found
libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00002b3fe6237000)
libm.so.6 => /lib64/libm.so.6 (0x00002b3fe659e000)
libc.so.6 => /lib64/libc.so.6 (0x00002b3fe689c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b3fe6c41000)
/lib64/ld-linux-x86-64.so.2 (0x00002b3fe5b2e000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b3fe6e5d000)
libz.so.1 => /lib64/libz.so.1 (0x00002b3fe7061000)
liblzma.so.5 => /usr/lib64/liblzma.so.5 (0x00002b3fe7277000)
多くの依存関係では、そのパスが存在しないことがわかりました。私はこれがPostgisを構築せずに手動で動作するために必要なライブラリとライブラリをコピーしたからだと思います。しかし、私はPostgisに必要なsoファイルのパスを知っています。依存関係で「見つかりません」をPostgisが要求するパスに変更するにはどうすればよいですか?
答え1
多くのチュートリアルではすでにこの内容を部分的に扱っていますが、多くのソリューションに基本的な例がありません。
- Linuxの場合、
patchelf
これはLinuxで行うことができます。 - MacOSには次のプログラムがあります。
install_name_tool
。
Linuxを使用しているとします。
メモ:
patchelf
多くのシステムにはデフォルトではインストールされません。apt install patchelf
または、パッケージマネージャが提供するものをdnf install patchelf
使用してインストールすることもできます。pacman install patchelf
patchelf --print-needed mysharedobject.so
# outputs:
../libsomething1.so
libsomething2.so.1
必要なライブラリのパスを置き換えます。
patchelf --replace-needed ../libsomething1.so /foo/bar/libsomething1.so mysharedobject.so
新しいパスをテストします。
patchelf --print-needed mysharedobject.so
# outputs:
/foo/bar/libsomething1.so
libsomething2.so.1
メモ:多くのチュートリアルでは、次のような他のツールをお勧めします。chrpath
.so
これは、プロパティが設定されたファイルには役立ちますが、rpath
rpathを持たないライブラリでは機能しないようですが、絶対リンクの場所を変更することもできません。
答え2
ld.so
動的リンカーは、PATH
実行時に接続する共有ライブラリを検索するときに-like環境変数を使用します。LD_LIBRARY_PATH
リンカがライブラリを見つける必要があるディレクトリの --separated リストを設定できますLD_LIBRARY_PATH
。たとえば、次のようになります。:
$ env LD_LIBRARY_PATH="$HOME/local/lib:/opt/other/lib" ./myprog
詳しくは、ld.so
システムのマニュアルを参照してください。