2009-08-28 8 views
4

MPICH2 est installé dans C: \ Program Files \ MPICH2. Il existe deux sous-répertoires (d'intérêt), \include qui contient des fichiers .h et \lib qui contient des fichiers .lib.L'éditeur de liens MinGW ne trouve pas les bibliothèques MPICH2

Le README qui vient avec MPICH2 a les instructions suivantes:

  1. créer un makefile
  2. ajouter –I...mpich2\include
  3. ajoutent –L...mpich2\lib
  4. ajoutent –lmpi
  5. ajouter les règles de vos fichiers source
  6. compiler

Comme il n'y a pas d'autres règles dans mon projet, je ne crée pas un makefile, je vais juste à la ligne de commande et d'essayer la compilation comme ceci:

g++ -I"C:\Program Files\MPICH2\include" main.cpp -L"C:\Program Files\MPICH2\lib" -lmpi 

Cela me donne une poignée de undefined reference erreurs sur chaque symbole MPI unique dans le code. J'ai passé des heures à essayer de le réparer, jongler -I, -L et -l bascule autour, en mélangeant l'ordre des paramètres, même copié tous les fichiers .lib dans le même répertoire que ma source, mais rien ne semble fonctionner.

Quel type de vaudou est nécessaire pour que cette chose lie?


EDIT: Je pense avoir trouvé le problème: voici un extrait de la sortie de l'éditeur de liens en mode verbose (ajout -Wl,--verbose à la commande de compilation):

attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll.a failed 
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll.a failed 
attempt to open C:\Program Files\MPICH2\lib/libmingwex.a failed 
attempt to open C:\Program Files\MPICH2\lib/mingwex.lib failed 
attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll failed 
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll failed 
attempt to open C:\Program Files\MPICH2\lib\libmingwex.a failed 

Apparemment, l'éditeur de liens ajoute une place / d'un \ aux noms de répertoire que je lui fournis (sauf lorsque vous recherchez le format lib___.a pour une raison quelconque), ce qui n'est évidemment pas un chemin valide. Est-il possible de dire à l'éditeur de liens d'utiliser des barres obliques inverses au lieu de barres obliques?

Cela a également attiré mon attention:

attempt to open /mingw/lib/libmingwex.a succeeded 

J'ai donc essayé de compiler comme ceci:

g++ -I"/Program Files/MPICH2/include" -L"/Program Files/MPICH2/lib" objManager.cpp ongom.cpp io.cpp main.cpp -lmpi -lcxx 

Mais je reçois toujours les mêmes erreurs undefined reference.

+0

de publier le journal du compilateur/éditeur de liens? –

+0

Il n'y a vraiment pas grand-chose à voir, c'est juste des dizaines de lignes comme ceci: 'C: \ Utilisateurs \ Bansaghi \ AppData \ Local \ Temp/ccIF61Uc.o: main.cpp :(. Text + 0x1615): référence non définie à 'MPI_Comm_rank '' – suszterpatt

Répondre

1

essayer d'ajouter -lmpicxx (le répertoire lib pour les liaisons C++), et assurez-vous que le -l... viennent après le fichier source cpp *. cela fonctionne pour moi:

g++ -Iinclude -Llib test/cxxpi.cpp -lmpicxx -lmpi 

EDIT: re: "undefined reference to 'MPI_Comm_rank'": pourrait-il que vous êtes mélanger/c en utilisant et/au lieu de C++? La liaison c - la liaison C++ serait MPI::Comm::Get_rank(). peut-être essayer de compiler votre programme en tant que c, ou, si vous voulez utiliser C++, en utilisant les liaisons appropriées (voir cxxpi.cpp dans le répertoire examples)?

* http://newsgroups.derkeiler.com/Archive/Comp/comp.parallel.mpi/2006-08/msg00036.html

+0

Toujours obtenir les mêmes erreurs de' référence indéfinie', même si j'ajoute chaque bibliothèque et place tous les paramètres exactement dans le même ordre que vous avez écrit. – suszterpatt

+0

avez-vous lu ma modification re: c C++ c liaisons? essayez également d'utiliser des barres obliques, des chemins relatifs et des espaces dans les noms de chemin. par exemple. Mettez vos sources dans "C: \ Program Files \ MPICH2 \ sc" et utilisez -I ../ include -L ../ lib etc à la fin, ça marche pour moi ... –

+0

oh, et d'ailleurs : l'éditeur de liens recherche libmpi.a et (s'il s'agit de C++) libmpicxx.a - c'est la raison pour laquelle -lmpicxx -lmpi. –

0

j'ai eu un problème similaire avec MinGW: pour les fichiers de bibliothèque avec une fin .lib, je devais mettre le nom de la bibliothèque sans fin (par exemple -llibboost_system-mgw34-mt lorsque la filename est libbboost_system-mgw34-mt.lib). Pour les fichiers de bibliothèque avec une terminaison .a, j'ai dû mettre le nom de la bibliothèque en excluant le "lib" de départ et le .a de fin (par exemple -lws2_32 pour libws2_32.a).

Donc dans votre cas - essayez -llibmpi (ou quel que soit votre fichier est appelé sans la fin .lib), c'est peut-être le même problème.


de: http://www.mingw.org/node/98/revisions/358/view

Note: certains chemins ont été imprimés avec «/» comme séparateur de chemin en un autre a été imprimé avec « \ » comme séparateur de chemin. J'ai substitué tous avec "/" car MinGW GCC accepte les deux.

Donc je ne mettrais pas trop de temps à trouver un moyen de corriger le séparateur de chemin. Est-ce que votre bibliothèque est compilée pour mingw?

peut-être: http://www.mingw.org/wiki/LibraryPathHOWTO vous aide un peu plus loin.

+0

Apparemment, l'éditeur de liens essaie une variété de formats, mais crée les mauvais chemins: voir ma modification dans la question. – suszterpatt

+0

pouvez-vous s'il vous plaît dire le nom du fichier mpi-libarary? est-ce libmpi.a ou libmpi.lib? Ceci est important car si vous voulez lier le fichier libmpi.lib, vous avez besoin de -llibmpi au lieu de -lmpi –

+0

Les fichiers n'ont pas de préfixe 'lib', et une extension de' .lib'. par exemple. 'mpi.lib' et' cxx.lib'. En regardant la sortie verbeuse ci-dessus, l'option '-lmpi' devrait essayer de chercher un' mpi.lib' (selon la 4ème ligne de l'extrait). – suszterpatt

3

GCC est pour trouver votre bibliothèque. Autrement, il signalerait: cannot find -lmpi.

D'une manière ou d'une autre, il arrive que les routines ne peuvent pas être trouvées dans cette bibliothèque. J'ai réussi à compiler un exemple avec cette syntaxe:

g++ -I../include cpilog.c ../lib/mpi.lib ../lib/mpe.lib 

J'ai fait cela à l'intérieur de msys cependant. Et mon répertoire ne contient pas d'espaces.

Après avoir retiré le fichier libmpi.a, cela fonctionne aussi:

g++ -I../include -L../lib cpilog.c -lmpi -lmpe 
1

j'ai eu le même problème résultant de la liaison des fichiers d'objets 32 bits avec bibliothèque MPICH 64 bits. Liaison avec libmpi.a 32 bits résolu le problème.

Questions connexes