2009-08-28 12 views
4

MPICH2はC:\ Program Files \ MPICH2にインストールされています。 2つのサブディレクトリ(関心事)があり、.hファイルを含む\includeと.libファイルを含む\libがあります。MinGWリンカーはMPICH2ライブラリを見つけることができません

MPICH2が付属してREADMEには、以下の手順があります。

  1. メイク
  2. を作成–I...mpich2\include
  3. を追加–L...mpich2\lib
  4. を追加するには、ソースファイルのルールを追加–lmpi
  5. を追加
  6. コンパイル

私のプロジェクトには他のルールが存在しないので、私はメイクファイルを作成しない、私は、コマンドラインに移動し、次のようにコンパイルしてみてください。

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

をこれは私にundefined referenceの握りを与えますコード内のすべての単一MPIシンボル上のエラー。 -I-L-lのスイッチを入れ替え、パラメータの順序を入れ替えて、すべての.libファイルを自分のソースと同じディレクトリにコピーしましたが、何も動作しないようです。

この物をリンクさせるには、どのようなブードゥーが必要ですか?


編集:私は、私は、問題を見つけたと思う:ここでは、リンカの出力の抜粋は(コンパイルコマンドに-Wl,--verboseを追加する)冗長モードでは:

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 

どうやら、リンカは代わりに/を追加ディレクトリ名に\を添付します(何らかの理由でlib___.a形式を検索する場合を除いて)。これは明らかに有効なパスではありません。リンカーにスラッシュの代わりにバックスラッシュを使用するよう指示する方法はありますか?

また、これは私の目を引いた。

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

しかし、私はまだ同じundefined referenceエラーを取得:

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

は、だから私はこのようにコンパイルしてみました。

+0

コンパイラ/リンカーログを投稿してもいいですか? –

+0

これは数多くの行があります: 'C:\ Users \ Bansaghi \ AppData \ Local \ Temp/ccIF61Uc.o:main.cpp :(。text + 0x1615):未定義の 'MPI_Comm_rank ' – suszterpatt

答えて

1

-lmpicxx(C++バインディング用のlib)を追加して、-l...になっていることを確認してから、のcppソースファイル*を確認してください。これは私の作品:

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

EDIT:RE: " 'MPI_Comm_rank' への未定義参照":それはあなたではなく、Cのアップ/混合Cを使用して/されていることが考えられ++? MPI_Comm_rankseems to be c結合--C++結合はMPI::Comm::Get_rank()となる。多分あなたのプログラムをcとしてコンパイルしてみてください。あるいは、適切なバインディングを使ってC++を使いたいのであれば(例のディレクトリのcxxpi.cppを参照してください)?

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

+0

すべてのライブラリを追加して、すべてのパラメータをあなたが書いたのと同じ順序で置いても、同じ未定義の参照エラーが発生します。 – suszterpatt

+0

あなたは私の編集のre:cとC++のバインディングを読んだことがありますか?また、スラッシュ、相対パスを使用し、パス名にスペースを入れないでください。例えば。ソースを "C:¥Program Files¥MPICH2¥sc"に置き、最後に-I ../include -L ../libなどを使用すると、それは私のために働いています... –

+0

ああ、ところで:リンカはlibmpi.aとそれが(もしC++なら)libmpicxx.aを探します。それが-lmpicxx-lmpiの理由です。 –

0

私はmingwのと同様の問題があった:エンディングの.libとそれらのライブラリファイルのために、私は終了せず、ライブラリの名前を入れていた(例えば-llibboost_system-mgw34-MTときfilenameはlibbboost_system-mgw34-mt.libです)。 .aの終わりのライブラリファイルの場合は、ライブラリの名前に、開始する "lib"と末尾の.a(libws2_32.aの場合は-lws2_32など)を入れなければなりませんでした。

あなたのケースでは - tryllllllllllllllllllllllllllllllllllllllllllファイルが.libエンディングなしで呼び出されます。これはおそらく同じ問題です。


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

注:いくつかの他のパス区切りとして「\」で印刷している間にいくつかのパスがパス区切り文字として「/」が印刷されました。私はMinGW GCCが両方を受け入れるので、すべてを "/"で置き換えました。

私はパスセパレータを修正する方法を見つけるのにあまり時間をかけませんでした。あなたのライブラリはmingw用にコンパイルされていますか?

おそらく:http://www.mingw.org/wiki/LibraryPathHOWTOが少しお手伝いします。

+0

明らかに、リンカはさまざまなフォーマットを試みますが、間違ったパスを作成します。 – suszterpatt

+0

mpi-libararyファイルの名前を教えてください。 libmpi.aまたはlibmpi.libですか? libmpi.libファイルにリンクしたい場合は、-lmpiの代わりに-llibmpiが必要です。 –

+0

ファイルには 'lib'プリフィックスと' .lib'の拡張子がありません。例えば'mpi.lib'と' cxx.lib'です。上記の冗長な出力を見ると、オプション '-lmpi'は' mpi.lib'を探すべきです(抜粋の4行目の通り)。 – suszterpatt

3

GCC あなたのライブラリーを見つけるにはです。それ以外の場合は、cannot find -lmpiと報告されます。

何とかルーチンが見つかりませんでした。そのライブラリにあります。私はこの構文で例をコンパイルすることができた:

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

私はmsysの中でそれをやった。私のディレクトリにはスペースは含まれていません。

libmpi.aファイルを削除した後、これも動作します:

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

を私は、64ビットMPICHライブラリと32ビットのオブジェクト・ファイルをリンクから生じる同様の問題がありました。 32ビットlibmpi.aとリンクすることで問題は解決しました。

関連する問題