2016-12-04 1 views
2

Je suis nouveau dans la bibliothèque LAPACK pour C++. Je travaille sur des matrices à grande échelle et leur factorisation QR. J'ai un problème avec l'utilisation de la bibliothèque Lapack dans Codeblocks. J'ai lié cette bibliothèque et blocs de code sur la base du lien suivant: How do I link to a library with Code::Blocks?. Mon code :: blocks connaît tous les en-têtes, commandes et fonctions de Lapacks mais je n'ai pas pu exécuter la fonction dgeqrf pour la factoisation QR avec cette erreur: undefined reference to dgeqrf`. J'ai également essayé d'utiliser armadillo bibliothèque. Je suis capable d'exécuter ses commandes simples mais quand je voulais exécuter qr(Q,R,X) pour la factorisation, il donne cette erreur: undefined reference to _gfortran_compare_string'. Donc, je pense que le problème pourrait être dans la procédure d'installation (pour lapack). J'ai téléchargé la nouvelle version de LAPACK et l'ai installé en utilisant CMakein C: \ lapack. Mon système d'exploitation est Windows 7 (morsure 64). Qui peut dire où est mon erreur? Dans l'étape d'installation ou étape de liaison? Comment puis-je trouver la raison de ce problème et comment il peut être résolu? Le message de journal de construction pour la bibliothèque de lapack:Comment puis-je être sûr d'installer correctement les librairies LAPACK et Armadillo?

-------------- Build: Debug in lllll (compiler: GNU GCC Compiler)--------------- 

mingw32-g++.exe -LC:\lapack -LC:\arma -LC:\ttmath-0.9.3 -L"C:\Program Files\R\R-3.2.1\include" -LC:\lapack\lib -LC:\arma -o bin\Debug\lllll.exe obj\Debug\main.o C:\lapack\lib\libblas.a C:\lapack\lib\liblapack.a C:\lapack\lib\liblapacke.a C:\lapack\lib\libtmglib.a C:\arma\examples\lib_win64\blas_win64_MT.lib C:\arma\examples\lib_win64\lapack_win64_MT.lib 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x376): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3a1): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3e6): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x40d): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x434): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x45b): more undefined references to `_gfortran_compare_string' follow 
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: C:\lapack\lib\liblapack.a(ilaenv.f.obj): bad reloc address 0x60 in section `.rdata' 
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation 
collect2.exe: error: ld returned 1 exit status 

également pour la bibliothèque Armadillo:

-------------- Build: Debug in ltest (compiler: GNU GCC Compiler)--------------- 
mingw32-g++.exe -Wall -fexceptions -g -IC:\ttmath-0.9.3 -I"C:\Program Files\R\R-3.2.1\include" -IC:\lapack\include -IC:\arma\include -c "D:\c++ code\ltest\main.cpp" -o obj\Debug\main.o 
mingw32-g++.exe -LC:\ttmath-0.9.3 -L"C:\Program Files\R\R-3.2.1\include" -LC:\lapack\lib -LC:\arma -o bin\Debug\ltest.exe obj\Debug\main.o C:\arma\examples\lib_win64\blas_win64_MT.lib C:\arma\examples\lib_win64\lapack_win64_MT.lib C:\lapack\lib\libblas.a C:\lapack\lib\liblapack.a C:\lapack\lib\liblapacke.a C:\lapack\lib\libtmglib.a 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x376): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3a1): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x3e6): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x40d): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x434): undefined reference to `_gfortran_compare_string' 
C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x45b): more undefined references to `_gfortran_compare_string' follow 
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: C:\lapack\lib\liblapack.a(ilaenv.f.obj): bad reloc address 0x60 in section `.rdata' 
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation 
collect2.exe: error: ld returned 1 exit status 
+1

Afficher la commande de liaison que vous utilisez – stark

+0

Personne ne peut dire pourquoi votre liaison échoue sans voir la commande de liaison défaillante . Veuillez copier et coller le journal de construction complet de la version défaillante dans votre question. Vous le trouverez dans l'onglet ** Construire le journal ** (pas l'onglet ** Construire les messages **) de la construction Codeblocks qui échoue. –

+0

@MikeKinghan Merci pour votre commentaire, j'ai collé le journal de construction dans ma question. – Ham82

Répondre

1

Contrairement à ce que vous avez écrit, les journaux de compilation ne montrent pas undefined reference to dgeqrf. Ils ont tous deux montrent une référence non définie à _gfortran_compare_string:

C:\lapack\lib\liblapack.a(ilaenv.f.obj):ilaenv.f:(.text+0x376): undefined reference to `_gfortran_compare_string' 

Ce message d'erreur vous indique que le fichier objet ilaenv.f.obj dans la bibliothèque liblapack.a fait un appel à fonction _gfortran_compare_string, mais l'éditeur de liens trouve que vous avez fourni avec aucun objet fichier ou bibliothèque dans laquelle cette fonction est définie.

La raison est que liblapack.a est une bibliothèque Fortran - compilé avec GCC Fortran (gfortran) - qui dépend libgfortran. Lorsque vous liez une bibliothèque dont dépend votre programme, vous devez également lier d'autres bibliothèques sur dont dépend la première bibliothèque.

Vous semblez avoir l'impression que vos bibliothèques LAPACK sont des bibliothèques C++. Ce sont des bibliothèques Fortran: LAPACK est écrit en Fortran. Cela ne fait pas obstacle à leur liaison dans un programme C++, à condition que vous remplissiez les conditions de liaison.

Dans ce cas, cela signifie que vous devez ajouter libgfortran à votre liaison. Et vous devez l'ajouter dans la séquence de liens après tout fichier objet ou bibliothèque qui en dépend.

Vous dites que vous avez installé LAPACK avec CMake. Si oui, alors vous avez construit vos bibliothèques LAPACK à partir de la source, avec le système make généré par CMake, et make doit avoir utilisé un compilateur gfortran installé sur votre système pour le faire. Comme vous avez gfortran quelque part, vous avez également libgfortran.Trouvez le répertoire d'installation de gfortran - il contiendra un sous-répertoire bin, contenant gfortran.exe - et demander à Windows recherche dans ce répertoire d'installation d'une bibliothèque statique libgfortran.a ou une bibliothèque dynamique (probablement) libgfortran-3.dll. Vous semblez aller avec des bibliothèques statiques: dans ce cas, ajoutez le libgfortran.a à l'extrémité de votre lien.

BTW il existe une redondance considérable dans la façon dont vous spécifiez vos bibliothèques de liaison. Puisque vous spécifiez toutes vos bibliothèques par des chemins absolus - par ex. C:\lapack\lib\liblapack.a - il est inutile de préciser les -L des options, puisque l'option de liaison -L existe seulement pour dire l'éditeur de liens les répertoires à rechercher d'abord des bibliothèques que vous spécifiez dans la forme courte habituelle, par exemple

... -LC:\lapack\lib ... -llapack ... -ltmglib ... 

Il est inutile de donner additionaly l'éditeur de liens -L les options pour les répertoires qui ne contiennent pas de des bibliothèques que vous liez, y compris les répertoires qui contiennent des fichiers d'en-tête. En Codeblocks, vous pouvez supprimer tous les répertoires de recherche ->Linker de votre options de construction du projet, à moins que vous choisissez de specfy bibliothèques sous forme courte Linker ->Autres options de l'éditeur de liens.

+0

Merci pour votre réponse complète. – Ham82