2014-05-08 4 views
4

J'ai gfortran installé sur mon système et le fichier libgfortran.a peut être trouvé au /usr/lib/gcc/x86_64-linux-gnu/4.6/. En utilisant nm je me suis assuré que la fonction _gfortran_compare_string est définie là:Impossible de lier à libgfortran.a

$ nm /usr/lib/gcc/x86_64-linux-gnu/4.6/libgfortran.a | grep _gfortran_compare_string 

Retours

0000000000000000 T _gfortran_compare_string 
0000000000000000 T _gfortran_compare_string_char4 

Mais, l'éditeur de liens de mon programme CUDA C renvoie des erreurs:

/usr/local/cuda-6.0/bin/nvcc --cudart static -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/home/chung/lapack-3.5.0 -link -o "pQP" ./src/pQP.o -lgfortran -llapacke -llapack -lcublas -lblas -lcurand 
nvcc warning : The 'compute_10' and 'sm_10' architectures are deprecated, and may be removed in a future release. 
/home/chung/lapack-3.5.0/liblapack.a(ilaenv.o): In function `ilaenv_': 
ilaenv.f:(.text+0x81): undefined reference to `_gfortran_compare_string' 

et plus tard une autre erreur, encore une fois liée à libgfortran:

/home/chung/lapack-3.5.0/liblapack.a(xerbla.o): In function `xerbla_': 
xerbla.f:(.text+0x49): undefined reference to `_gfortran_st_write' 
xerbla.f:(.text+0x54): undefined reference to `_gfortran_string_len_trim' 
xerbla.f:(.text+0x66): undefined reference to `_gfortran_transfer_character_write' 
xerbla.f:(.text+0x76): undefined reference to `_gfortran_transfer_integer_write' 
xerbla.f:(.text+0x7e): undefined reference to `_gfortran_st_write_done' 
xerbla.f:(.text+0x87): undefined reference to `_gfortran_stop_string' 

Mais, encore en utilisant nm, j'ai trouvé que _gfortran_st_write, etc sont définis dans libgfortran.a.

Liens: Complete log et source code.

Remarque: Lapack utilise libgfortran. J'ai récemment installé lapack et j'ai fait tous les tests et ils sont tous passés.

Répondre

5

Vous devez modifier l'ordre dans lequel vous spécifiez les bibliothèques statiques dans l'éditeur de liens. Si vous faites quelque chose comme ceci:

nvcc --cudart static -L/usr/lib/gcc/x86_64-linux-gnu/4.6 \ 
-L/home/chung/lapack-3.5.0 -link -o "pQP" ./src/pQP.o \ 
-llapacke -llapack -lcublas -lblas -lcurand -lgfortran 

Vous devriez trouver que cela fonctionnera. La raison sous-jacente (et c'est un trait de la chaîne d'outils gcc/gnu et non de nvcc) est que les listes de dépendances de liaison pour les bibliothèques statiques sont analysées de gauche à droite par l'éditeur de liens gnu. Si vous spécifiez une bibliothèque statique avant toute bibliothèque qui en dépend, elle sera ignorée car elle n'a aucune dépendance dans la liste de liens au moment du traitement lorsqu'elle est rencontrée pour la première fois.

+0

Incroyable! Merci un million! Je serai éternellement redevable! –