0

少し問題があります。C プログラムとやり取りする Java プログラムをコンパイルしようとしています。このプログラムは、さらに FORTRAN 77 プログラムとやり取りします。基本的には、Java、JNI を介して、LAPACK (FORTRAN バージョン) を使用する C プログラムを使用します。

C プログラムは単独で正常に動作し、FORTRAN 77 プログラムと正常に連携しますが、Java でテスト プログラムを実行すると、Fortran と C の間のリンクが壊れます。

次のように C プログラムをコンパイルします。

gcc -c -fPIC -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux -llapack -lblas -lm Optibox.c
gcc -shared -o libOptibox.so Optibox.o
LD_LIBRARY_PATH=./:${LD_LIBRARY_PATH} java Optibox

次のエラーが返されます。

java: symbol lookup error: /home/christian/workspace/testJNI4/libOptibox.so: undefined symbol: dsytrf_

これは、次のコード スニペットが原因で発生します。

static long dsytrf(char UPLO, long N, double* A, long LDA, long* IPIV, double* WORK, long LWORK)
{
    extern void dsytrf_(char* UPLOp, long* Np, double* A, long* LDAp, long* IPIV, double* WORK, long* LWORKp, long* infop);
    long info;
    dsytrf_(&UPLO, &N, A, &LDA, IPIV, WORK, &LWORK, &info);
    return info;
}

関数をテストする C プログラムを作成するだけであれば、この関数は問題なく動作しますが、Java を使用すると、LAPACK はリンクされなくなります。

したがって、問題は次のとおりだと思います。この場合、Java コンパイラ リンクを適切に作成するにはどうすればよいでしょうか。

編集:少なくとも今のところ解決策を見つけました。リンカー ステートメントを変更して、BLAS、LAPACK、および MATRIX ライブラリ自体もリンクするようにしました。これで問題は完全に解決されたように見えますが、私はその優雅さに確信が持てません。Idav1s から提供されたライブラリ パスの提案を試してみます。

gcc -shared -o libOptibox.so Optibox.o liblapack.so libblas.so libm.so

これには、/usr/lib 内でライブラリを見つけてコンパイル ディレクトリにコピーする必要がありましたが、少なくとも機能します。

4

2 に答える 2

0

LAPACKとblaslibsを次の場所に追加する必要がありますjava.library.path

java -Djava.library.path=/usr/lib/lapack:<other paths> Optibox

それらをに追加するLD_LIBRARY_PATHだけでは不十分な場合があります。

編集:あなたのリンクステートメントも正しくありません。そのはず:

gcc -shared -fPIC -o libOptibox.so Optibox.o -llapack -lblas -lm

を構築する場合、リンカーフラグは関係ありませんOptibox.o。libには他のlibOptibox.solibが必要です。そうしないと、ロード時にそれらが見つかりません。

于 2012-05-23T20:07:11.297 に答える
0

これは実際には回答ではなくコメントとして属しますが、コメントボタンが見つかりません!とにかく、これはgccのマニュアルページから、re: "-shared"フラグ: "リンクできる共有オブジェクトを生成します....予測可能な結果を​​得るには、に使用されたのと同じオプションのセットも指定する必要があります。このオプションを指定すると、コード(-fpic、-fPIC、またはmodelサブオプション)が生成されます。」

gccリンクステートメントに「-fPIC」はありません。それが私が始めるところです。(実際、私が実際に始めるのは、このひどいコードを書いてほしいと思っている人の机に飛び乗って、気が変わるまで彼らに向かって叫ぶことです。)

于 2012-05-23T20:07:27.600 に答える