Liaison statique contre LAPACK

J’essaie de faire une version de certains logiciels et je travaille actuellement à travers un script pour le processus de construction. Je suis coincé sur quelque chose que je n’aurais jamais pensé devenir, liant statiquement LAPACK sur Linux x86_64. Pendant la configuration, AC_SEARCH_LIB([main],[lapack]) fonctionne, mais la compilation des unités lapack ne fonctionne pas. Par exemple, la undefiend reference to 'dsyev_' pas.

J’ai confirmé avoir les bibliothèques installées et même les avoir moi-même compilées avec les options appropriées pour les rendre statiques avec les mêmes résultats.

Voici un exemple que j’avais utilisé lors de ma première expérience avec LAPACK il y a quelques années et qui fonctionne de manière dynamic, mais pas statique: http://pastebin.com/cMm3wcwF

Les deux méthodes que j’utilise pour comstackr sont les suivantes,

 gcc -llapack -o eigen eigen.c gcc -static -llapack -o eigen eigen.c 

Votre ordre de liaison est faux. Liez les bibliothèques après le code qui les requirejs, pas avant. Comme ça:

 gcc -o eigen eigen.c -llapack gcc -static -o eigen eigen.c -llapack 

Cela devrait résoudre les problèmes de liaison.


Pour répondre à la question suivante, à savoir pourquoi cela fonctionne, la documentation de GNU ld dit ceci:

Cela fait une différence où dans la commande vous écrivez cette option; L’éditeur de liens recherche et traite les bibliothèques et les fichiers objects dans l’ordre dans lequel ils ont été spécifiés. Ainsi, foo.o -lz bar.o' searches library z’ après le fichier foo.o mais avant bar.o. Si bar.o fait référence à des fonctions dans «z», ces fonctions peuvent ne pas être chargées.

……..

Normalement, les fichiers trouvés de cette façon sont des fichiers de bibliothèque – des fichiers d’archive dont les membres sont des fichiers objects. L’éditeur de liens gère un fichier d’archive en recherchant les membres qui définissent des symboles jusqu’ici référencés mais non définis. Mais si le fichier trouvé est un fichier object ordinaire, il est lié de la manière habituelle.

c’est à dire. L’éditeur de liens va faire un passage dans un fichier à la recherche de symboles non résolus, et il suit les fichiers dans l’ordre que vous les fournissez (c’est-à-dire “de gauche à droite”). Si vous n’avez pas encore spécifié de dépendance lorsqu’un fichier est lu, l’éditeur de liens ne sera pas en mesure de satisfaire cette dépendance. Chaque object de la liste de liens est analysé une seule fois.

Notez également que GNU ld peut réorganiser dans les cas où des dépendances circulaires sont détectées lors de la liaison de bibliothèques partagées ou de fichiers objects. Mais les bibliothèques statiques ne sont analysées qu’une seule fois pour les symboles inconnus.