Undefined reference to sstev

Signaler
Messages postés
16
Date d'inscription
lundi 24 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2006
-
Guilou34
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
-
  Bonjour a tous


je rencontre en ce moment un probleme de compilation avec la librarie lapack qui m'embete depuis bien une semaine.

En fait , j'ai un programme en c++ et dans ce programme je fais appel a la librarie lapack qui est une librairie fortran.

Pour assurer la compatibilité entre le langage c++ et le langage
fortran ,j'utilise la librairie gfortran a la compilation
da   ns le makefile.

Mon makefile ressemble alors a ceci:


  val_vec: val_vec.o

    g++ val_vec.o -L/usr/lib/ -llapack -lgfortran -o val_vec


val_vec.o: val_vec.cpp lapack.h

    g++ val_vec.cpp -c


clean:

    rm*.o val_vec *~core


Je ne sais pas ce que vous pensez de ce makefile mais l'edition de liens me semble correct.


Le probleme vient a la compilation ou j'obtiens le message suivant:


 [root@localhost atomes]# make

g++ val_vec.o -L/usr/lib/ -llapack -lgfortran -o val_vec

val_vec.o: In function `resolution(int, float*, float*, float*)':

val_vec.cpp:(.text+0x36b): undefined reference to `sstev(char, int, float*, float*, float*, int, float*, int)'

collect2: ld returned 1 exit status

make: *** [val_vec] Erreur 1


la fonction sstev etant une fonction faisant parti de la librairie lapack.


Quelqu'un serait il comment resoudre ce probleme

3 réponses

Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>
 






Si on est certain que la référence manquante est bien présente dans une librairie déclarée, je pense que c’est le signe que les librairies sont mal rangées.




 







 Supposons un module appelant nom1 et nom2  avec  quelque chose comme ceci :




 






Lib1(objet o1( interne nom1),o2(interne nom3) )  et  lib2 (o3(interne nom2,externe nom3)).




 






Le module o2 ne sera jamais chargé parce qu’il n’y a aucune raison de le faire et nom3 sera déclaré absent. Notons que la situation est différente si cet appel « en arrière » a lieu dans une même librairie ; si o3 faisait partie de lib1 par exemple, parce que l’éditeur de liens procède systématiquement à une relecture d’une librairie. (En principe, les modules d’une librairie  sont ordonnés pour éviter cette situation.)  




 






En changeant l’ordre de lib1 et lib2 dans la ligne de commande, le problème sera ici résolu. Si de nouveaux appels ne sont plus satisfaits, (dans  le cas où les librairies ont des origines différentes) on peut essayer de déclarer  lib1 lib2 lib1 pour forcer la relecture de lib1.



Mais si  le nombre de librairies implicites et explicites est trop grand, il faut procéder à une totale réorganisation, par exemple en concaténant plusieurs librairies.




.
Messages postés
16
Date d'inscription
lundi 24 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2006

Tiens une question relatif a ton message: comment etre sur qu'une fonction est bien presente dans une librarie?


Est il possible d'editer le contenu d'une librairie?


Parce que je me suis egalement demandé si le probleme ne venait pas de la declaration de la fonction, de son ecriture...
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Sstev  est sous-routine Fortran qui calcule les valeurs propres d'une matrice.
Elle n'est pas toujours présente dans Lapack, sous ce nom en tout cas.
Je ne connais pas d'utilitaire permettant de lister une librairie compiléee sauf dans l'univers Microsoft. Néanmoins, il est fort probable que les noms des fonctions soient en Ascii et qu'une recherche avec un editeur de texte sera  suffisante.
Sur http://www.cs.colorado.edu/~jessup/lapack/packages.html  en trouve la source complète ( en Fortran) de cette librairie et Sstev  y est présent.
Cordialement