4

MPICH2はC:\ Program Files\MPICH2にインストールされます。(対象の)2つのサブディレクトリがあり、\include.hファイルと\lib.libファイルが含まれています。

MPICH2に付属のreadmeには、次の手順があります。

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

私のプロジェクトには他のルールがないので、makefileを作成しません。コマンドラインに移動して、次のようにコンパイルしてみます。

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

これによりundefined reference、コード内のすべてのMPIシンボルで一握りのエラーが発生します。私はそれを修正しようとして何時間も費やし、ジャグリングし-I、切り替え、パラメーターの順序をシャッフルし、すべての.libファイルをソースと同じディレクトリにコピーしましたが、何も機能しないようです。-L-l

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


編集:私は問題を見つけたと思います:これは冗長モードでのリンカーの出力の抜粋です(-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)。これは明らかに有効なパスではありません。スラッシュの代わりにバックスラッシュを使用するようにリンカーに指示する方法はありますか?

これも私の目に留まりました:

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

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

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

しかし、それでも同じundefined referenceエラーが発生します。

4

4 に答える 4

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
于 2012-09-21T07:03:54.890 に答える
1

(c++ バインディング用の lib) を追加してみて、cpp ソース ファイルの-lmpicxxに必ず. これは私のために働く:-l...

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

編集: re: 「'MPI_Comm_rank' への未定義の参照」: c++ の代わりに / c と / を混同している可能性がありますか? cバインディングのようMPI_Comm_rank ですMPI::Comm::Get_rank()-c ++バインディングは. プログラムを c としてコンパイルしてみてください。または、c++ を使用する場合は、適切なバインディングを使用してください (cxxpi.cppサンプル dir を参照)。

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

于 2009-08-29T18:32:16.653 に答える
1

32 ビットのオブジェクト ファイルを 64 ビットの MPICH ライブラリにリンクすると、同様の問題が発生しました。32 ビットの libmpi.a とリンクすると問題が解決しました。

于 2013-02-11T03:46:20.830 に答える
0

私は mingw で同様の問題を抱えていました: .lib で終わるライブラリ ファイルの場合、ライブラリの名前を末尾なしで入力する必要がありました (例: ファイル名が libbboost_system-mgw34-mt.lib の場合は -llibboost_system-mgw34-mt )。 . 末尾が .a のライブラリ ファイルの場合、先頭の「lib」と末尾の .a を除いてライブラリの名前を付ける必要がありました (たとえば、libws2_32.a の場合は -lws2_32)。

したがって、あなたの場合 - -llibmpi (または .lib の終わりなしでファイルが呼び出されるもの) を試してください。おそらく同じ問題です。


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

注: 一部のパスは、パスの区切り記号として「/」を使用して印刷されましたが、他のパスは、パスの区切り記号として「\」を使用して印刷されました。MinGW GCC は両方を受け入れるため、すべてを「/」に置き換えました。

したがって、パス区切り記号を修正する方法を見つけるのにあまり時間をかけません。あなたのライブラリは mingw 用にコンパイルされていますか?

おそらく: http://www.mingw.org/wiki/LibraryPathHOWTOがもう少し役立ちます。

于 2009-08-31T14:44:55.890 に答える