2011-06-09 10 views
1

Linuxで共有ライブラリを読み込む際に奇妙な問題に直面しています。私のアプリケーションには2つの共有ライブラリ(abc.soとxyz.soを想定)があります。 abc.soは、abc.soをロードしようとするたびにxyz.soに依存します.jvmは最初にxyz.soをロードします。System.load()メソッドはLD_LIBRARY_PATH環境変数を設定せずに共有ライブラリをロードしません

ここで、LD_LIBRARY_PATHをこれらの2つのライブラリを含むフォルダに設定することによって、これらのライブラリをロードすると、問題なく動作します。しかし、System.load( "%FULL_PATH%/ abc.so")でabc.soをロードしようとしているとき、ロードされていません。次の行はエラーとして表示されます。 未定義シンボル:__cxa_pure_virtual。

このエラーを理解するのに役立つ人はいますか?前もって感謝します!

注:プロジェクトによっては、LD_LIBRARY_PATHを変更できないため、System.load()メソッドを使用してabc.soをロードする必要があります。

答えて

0

リンカーが 'abc.so'の 'xyz.so'依存関係を解決できないため、ロードが失敗しています。 Linuxローダーは、 'abc.so'と同じディレクトリにある 'xyz.so'を自動的に検索しません。環境変数LD_LIBRARY_PATHを使用するか、または/etc/ld.so.confファイルを変更して、どこを探すかを明示的に指示する必要があります。

DLLをロードする必要があるときに私はJavaではなくPythonモジュールから試しましたが、通常、ライブラリのロードを試みる直前にプロセスの環境変数を変更します。ラッパースクリプトを書いたり、ホームディレクトリのドットファイルを変更するよりもはるかに簡単です。

また、すべての前提条件を適切な順序で手動でロードすることもできます。しかし、ローダーがすべてのシンボルを非公開でロードするのではなく、グローバルシンボルテーブルに配置するようにする必要があります。 Javaの処理方法がわからない

関連する問題