少し問題があります。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 内でライブラリを見つけてコンパイル ディレクトリにコピーする必要がありましたが、少なくとも機能します。