2012-05-23 8 views
0

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!

+0

Où sont les composants Java et Fortran? Le seul module affiché dans la construction est celui qui compile 'Optibox.c' en' libOptibox.so'. – wallyk

+0

/usr/lib/lapack/liblapack.donc – user1233977

+3

'Java <-> C <-> Fortran'? Gah! Je ne voudrais pas être à ta place – slezica

Répondre

0

Vous devez ajouter vos LAPACK et blas libs java.library.path:

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

les ajouter à LD_LIBRARY_PATH est parfois pas assez.

EDIT: votre instruction de lien est également incorrecte. Il devrait être:

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

Les drapeaux de l'éditeur de liens ne sont pas pertinentes lors de la construction Optibox.o. La bibliothèque libOptibox.so a besoin des autres bibliothèques. Sinon, il ne les trouvera jamais au moment du chargement.

+0

Je vais essayer ça un peu plus tard. Merci d'avoir répondu! J'ai trouvé une solution, cependant. Je vais ajouter ma propre réponse sous peu. – user1233977

+0

Cela, malheureusement, n'aide pas. – user1233977

0

Cela appartient vraiment comme un commentaire, au lieu d'une réponse, mais je ne trouve pas le bouton de commentaire! Donc de toute façon, ceci depuis la page de manuel de gcc, re: le drapeau "-shared": "Produire un objet partagé qui peut ensuite être lié .... Pour les résultats prévisibles, vous devez également spécifier le même ensemble d'options qui ont été utilisées pour générer du code (-fpic, -fPIC ou des sous-options de modèle) lorsque vous spécifiez cette option. "

Il n'y a pas de "-fPIC" dans votre instruction de lien gcc. C'est là que je commencerais. (En fait, où commence vraiment commence à sauter sur le bureau de celui qui veut que vous écrivez ce code terrible et les crier jusqu'à ce qu'ils changent d'avis.)

+0

Bien repéré. Je vais essayer d'ajouter cela aussi. Cependant, il n'y aura pas de changement d'avis. C'est absolument nécessaire, malheureusement. Même moi, je peux voir pourquoi. : | – user1233977

+0

En raison de cela étant indiqué dans la documentation, cela ne fait probablement pas de mal, mais je peux vous dire que cela ne résout pas non plus le problème. – user1233977

Questions connexes