2

エクスポートされた Java プロジェクトを開発マシンから本番環境に移動した後、問題が発生しました。

Java プロジェクト (Eclipse プラグイン) には、私が作成した JNI ライブラリがあり、これはオープン ソース ライブラリに依存しており、これはさらに Boost に依存しています。Boost を含むすべてを SLES11 マシンでコンパイルしたところ、プログラムは問題なく動作しました。

プログラムを別のマシンに移動すると、次のエラーが発生します。

java.lang.UnsatisfiedLinkError:/path/to/project/lib/libMyJNI.so: libboost_system.so.1.67.0: cannot open shared object file: No such file or directory

必要なライブラリを同じディレクトリにコピーしました。 ldd libMyJNI.so20の依存関係をリストしますが、それらすべてを解決します。

それでも同じエラーが発生します。

依存関係を読み込んで認識java.library.pathしようとするため、正しく設定されていると思います。libMyJNI.so

ldd動作する場合、Java が依存関係を解決する必要があると期待していますか? どんな手掛かり?

ありがとうございました!

編集:これがlddの出力ですldd libMyJNI.so

linux-vdso.so.1 =>  (0x00007fffa59ff000)
libboost_system.so.1.67.0 (0x00007fc427bce000)
libboost_filesystem.so.1.67.0 (0x00007fc4279b4000)
libboost_thread.so.1.67.0 (0x00007fc42778f000)
libboost_date_time.so.1.67.0 (0x00007fc42757a000)
libboost_iostreams.so.1.67.0 (0x00007fc42735f000)
libboost_serialization.so.1.67.0 (0x00007fc42710f000)
libboost_chrono.so.1.67.0 (0x00007fc426f06000)
libboost_atomic.so.1.67.0 (0x00007fc426d04000)
libboost_regex.so.1.67.0 (0x00007fc426a00000)
libpcl_common.so.1.8 (0x00007fc42673b000)
libpcl_io.so.1.8 (0x00007fc4263cb000)
libpcl_octree.so.1.8 (0x00007fc425fdc000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fc425c98000)
libm.so.6 => /lib64/libm.so.6 (0x00007fc425a42000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc42582b000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc4254cc000)
librt.so.1 => /lib64/librt.so.1 (0x00007fc4252c3000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc4250a6000)
libz.so.1 => /lib64/libz.so.1 (0x00007fc424e8f000)
libgomp.so.1 => /usr/lib64/libgomp.so.1 (0x00007fc424c86000)
libpcl_io_ply.so.1.8 (0x00007fc424a21000)
libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00007fc4247f9000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc427fe8000)
4

1 に答える 1

0

@ user2543253 のおかげで問題が解決しました。私は将来の読者のために答えを出しています(私が同じ問題を抱えているときは私も含めて)。

java.library.pathJNIライブラリをロードできるため、正しく設定されました。他のライブラリ (依存関係) は、 にリストされているディレクトリにある必要がありますLD_LIBRARY_PATH。したがって、ソフトウェアを展開するときは、次のいずれかを行うことができます

  • LD_LIBRARY_PATHまたはに通常存在する場所に依存関係をインストールします
  • LD_LIBRARY_PATHプラグインを開始する前にディレクトリを追加します。

ldd現在のディレクトリも参照するため、ライブラリのリンクに成功する可能性があります。そのため、失敗する可能性がありますldd libMyJNI.soが、成功する可能性があります。ldd \path\to\libMyJNI.soこの場合、JNI は機能しません。

于 2018-07-04T15:45:26.040 に答える