2016-01-05 4 views
2

Je ne parviens pas à compiler le code d'introduction Lapack dans Visual Studio 2013 pour une plate-forme 64 bits. Résumé de ce que je suis en train de faire:Liaison LAPACK, 64 bits, Visual Studio 2013

  • Get Lapack et en cours d'exécution à l'appui de 64 bits C++ logiciel que je vous écris dans Visual Studio 2013.
  • J'utilise les mêmes instructions données à http://icl.cs.utk.edu/lapack-for-windows/lapack/#build en suivant les instructions pour utiliser les bibliothèques pré-construites (* .dll, * .lib & * .h) et en faisant référence à celles de ma compilation.

étapes Visual Studio que je prends:

  • Je commence un nouveau projet - choisir le Visual C++ vide modèle de projet
  • Dans les propriétés du projet, je suis allé à Configuration Manager et créer une nouvelle plate-forme de solution de x64 (copie des paramètres Win32)
  • Ensuite, pour toutes les configurations et pour toutes les plates-formes, je pointe les dépendances de la bibliothèque supplémentaire de lieur à l'endroit où je place les fichiers * .lib préconfigurés. J'ajoute aussi au Linker => Entrez les bibliothèques libblas.lib et liblapack.lib comme indiqué.
  • Note 1: Je ne rajoute aucune des fonctionnalités de Lapacke car je ne crois pas que le programme d'exemple simple que j'essaye de lancer nécessitera ce genre de choses (et que l'ajout de ces chemins ne semble pas aider dans les tentatives précédentes
  • Note 2: Je sais que les librairies que j'ai téléchargées sont 64 bits seulement - mais j'ai appliqué ces propriétés de projet à 'toutes les plateformes' (y compris la plate-forme 32 bits) pour démontrer quelque chose ...
  • Ensuite, dans Visual Studio, j'ai ajouté un seul fichier source C++ 'source.cpp' avec le code fourni sur www.cs.rochester.edu/~bh/cs400/using_lapack.html. Voici le code

#include < stdio.h> 

extern "C" void dgesv_(const int *N, const int *nrhs, double *A, const int *lda, int *ipiv, double *b, const int *ldb, int *info); 
extern "C" void dgels_(const char *trans, const int *M, const int *N, const int *nrhs, double *A, const int *lda, double *b, const int *ldb, double *work, 
const int * lwork, int *info); 

int main(void) 
{ 
    double A[9] = { 76, 27, 18, 25, 89, 60, 11, 51, 32 }; 
    double b[3] = { 10, 7, 43 }; 

    int N = 3; 
    int nrhs = 1; 
    int lda = 3; 
    int ipiv[3]; 
    int ldb = 3; 
    int info; 

    dgesv_(&N, &nrhs, A, &lda, ipiv, b, &ldb, &info); 

    if (info == 0) /* succeed */ 
     printf("The solution is %lf %lf %lf\n", b[0], b[1], b[2]); 
    else 
     fprintf(stderr, "dgesv_ fails %d\n", info); 

    return info; 
} 
  • Et je tente de compiler ce programme (soit Debug ou configuration Edition) - pour une plate-forme x64 et obtenir l'erreur:

error LNK2019: unresolved external symbol dgesv_ referenced in function main

qui semble indiquer que les bibliothèques préconfigurées ne contiennent pas ces fonctions.

  • La chose très étrange est que si je change la plate-forme à 'win32', le projet compile! (Hein?) Donc, il est de trouver ces bibliothèques pour la plate-forme 32 bits. (Btw, si j'essaye d'exécuter l'exécutable généré là, j'obtiens une erreur qu'un fichier * .dll manque - ce qui n'est pas surprenant étant donné que j'ai seulement téléchargé les librairies 64-bit ...)

en outre, l'ajout d'un trait de soulignement avant dgesv_ dans le code ne semble pas aussi travailler - me donner l'erreur lors de la compilation:

fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'

qui suit également une partie de la discussion à icl.cs.utk.edu/lapack- forum/viewtopic.php?f = 12 & t = 4260

Encore une fois, toute cette question semble suivre la discussion à http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4260 et les gens là-bas semblait indiquer que la construction des bibliothèques vous avec CMAKE est une solution (je suis en train mais en cours d'exécution que les questions y sans trouver le bon compilateur Fortran dans les bibliothèques MinGW-W64, j'ai téléchargé < = c'est probablement approprié pour un post différent!). Plus important encore, dans le dernier message de ce sujet, 'admin' a indiqué qu'ils avaient corrigé tout problème antérieur avec ces librairies préconstruites et qu'ils devraient maintenant fonctionner. Donc je dois faire quelque chose d'incorrect, non? Est-ce que quelqu'un voit un problème dans le flux de travail que j'utilise ici?

Répondre

1

J'ai travaillé un peu plus sur ce sujet (et interfacé avec certaines personnes sur le forum de discussion Lapack). Il y a deux postes là-bas qui décrivent les détails:

  • La première, à http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4873&p=11711#p11711, essentiellement fait double emploi avec la question que je posais ci-dessus. La conclusion de cette interface est que les bibliothèques pré-construites disponibles sur icl.c.utk.edu sont obsolètes pour mon système et j'ai été encouragé à construire mes propres bibliothèques Lapack en utilisant CMake.

  • Le deuxième message, à http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4875&p=11710#p11710, décrit un problème que je devais obtenir CMake pour générer ces bibliothèques. Je suivais les instructions détaillées au http://icl.cs.utk.edu/lapack-for-windows/lapack/#build mais faisais une erreur dans la façon dont j'utilisais CMake. En conclusion, j'avais besoin de spécifier 'MinGW Makefiles' comme mon 'générateur' dans CMake (je spécifiais 'studio visuel'!). Une fois cela fait, tout s'est déroulé comme décrit dans les instructions d'origine et j'ai pu compiler le simple projet Visual Studio que j'ai décrit ci-dessus.