2010-05-10 7 views
1

Contexte:
Je travaille sur un projet écrit dans un mélange de C et Fortran 77 et maintenant besoin de relier les bibliothèques LAPACK/BLAS au projet (tout dans un environnement Linux). Le LAPACK en question est la version 3.2.1 (y compris BLAS) de netlib.org. Les bibliothèques ont été compilées en utilisant le Makefile de niveau supérieur (make lapacklib et make blaslib).Lier les bibliothèques LAPACK/BLAS

Problème:
pendant la liaison, les messages d'erreur a affirmé que certains (pas tous) BLAS-routines appelées des routines LAPACK-ne sont pas définis. Cela m'a donné quelques maux de tête, mais le problème a finalement été résolu lorsque (dans le Makefile) l'ordre d'apparition des bibliothèques à lier a été changé.

code:
Dans ce qui suit, (a) donne des erreurs tout en (b) ne fonctionne pas. La liaison est effectuée par (c).
(a) LIBS = $ (LAPACK) /blas_LINUX.a $ (LAPACK) /lapack_LINUX.a
(b) LIBS = $ (LAPACK) /lapack_LINUX.a $ (LAPACK) /blas_LINUX.a
(c) gcc -Wall -O -o $ @ project.o projet.Un $ (LIBS)

question:
Quelle pourrait être la raison pour laquelle les références non définies seulement quelques routines et ce qui rend l'ordre d'apparition pertinent?

Répondre

0

Typiquement, on place toujours la bibliothèque "plus fondamentale/basique" à la droite du "moins fondamental/basique" - c'est-à-dire que l'éditeur de liens cherchera à droite un fichier pour la définition d'une fonction apparaissant dans ce fichier . Ceci n'est supposément plus nécessaire avec les linkers modernes, mais c'est toujours une bonne idée (comme dans votre cas). Je ne sais pas pourquoi cela ne comptait que pour plusieurs routines.

0

Est-ce que clapack est utilisé comme implémentation LAPACK? Si non, vous pouvez essayer de l'utiliser.

1

La bibliothèque LAPACK nécessite des éléments de BLAS et l'éditeur de liens effectue une recherche de gauche à droite. Donc, mettre BLAS après LAPACK (option (b)), a fonctionné.

Si vous voulez que cela fonctionne toujours, quel que soit l'ordre, vous pouvez utiliser des groupes de liaison:

-Wl,--start-group $(LAPACK)/blas_LINUX.a $(LAPACK)/lapack_LINUX.a -Wl,--end-group 

qui indique l'éditeur de liens en boucle à travers les bibliothèques jusqu'à ce que tous les symboles seront résolus (ou jusqu'à ce qu'il remarque que en boucle à nouveau ne va pas aider).

Questions connexes