J'ai un léger problème. J'essaye de compiler un programme de Java interfaçant avec un programme de C, qui s'interface ensuite plus loin avec un programme de FORTRAN 77. Fondamentalement, Java, à travers JNI, en utilisant un programme C qui utilise LAPACK (la version FORTRAN)Java <-> C <-> Fortran
Le programme C fonctionne très bien, en interface avec le programme FORTRAN 77 comme il se doit, mais quand je lance le programme de test en Java , le lien entre Fortran et C est cassé.
Je compilez le programme C comme ceci:
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
Il renvoie l'erreur:
java: symbol lookup error: /home/christian/workspace/testJNI4/libOptibox.so: undefined symbol: dsytrf_
qui entre en jeu à cause de ce bout de code:
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;
}
Cette fonction fonctionne très bien si je fais simplement un programme C tester la fonction, mais en utilisant Java, LAPACK n'est plus lin ked.
Donc je suppose que la question est: Comment faire le lien du compilateur Java correctement dans cette instance?
EDIT: J'ai trouvé une solution au moins pour l'instant. J'ai changé l'instruction de lien pour lier également dans les bibliothèques de BLAS, de LAPACK et de MATRIX elles-mêmes. Cela semble résoudre la question entièrement, mais je ne suis pas convaincu de son élégance. Je vais essayer la suggestion de chemin de bibliothèque donnée par Idav1s.
gcc -shared -o libOptibox.so Optibox.o liblapack.so libblas.so libm.so
Il a fallu que je trouve les bibliothèques dans les/usr/lib et les copier à mon répertoire de compilation, mais au moins ça marche!
Où sont les composants Java et Fortran? Le seul module affiché dans la construction est celui qui compile 'Optibox.c' en' libOptibox.so'. – wallyk
/usr/lib/lapack/liblapack.donc – user1233977
'Java <-> C <-> Fortran'? Gah! Je ne voudrais pas être à ta place – slezica