Ubuntu11.0464ビットを実行しています。OpenMPIをインストールしました。Gropp / Lusk/Skjellumの著書「UsingMPI」のテスト問題の抜粋である次のコードを作成しようとしています。
#include <math.h>
#include "mpi.h"
int main(int argc, char *argv[])
{
int size, rank;
MPI::Init(argc, argv);
size = MPI::COMM_WORLD.Get_size();
rank = MPI::COMM_WORLD.Get_rank();
MPI::Finalize();
return 0;
}
ターミナルから、mpiccラッパーを使用して、自分のマシンでコンパイルおよびリンクするために必要な次の情報を取得できます。
$ mpicc --showme:compile
-I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread
$ mpicc --showme:link
-pthread -L/usr/lib/openmpi/lib -lmpi -lopen-rte -lopen-pal -ldl -Wl,--export-dynamic -lnsl -lutil -lm -ldl
コードを正常にコンパイルできます。ただし、リンクは失敗します。これが私のコンパイラとリンカのステップです:
make all
Building file: ../main.cpp
Invoking: GCC C++ Compiler
mpicc -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -O0 -g3 -Wall -c -fmessage-length=0 -pthread -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"
Finished building: ../main.cpp
Building target: test
Invoking: GCC C++ Linker
mpicc -L/usr/lib/openmpi/lib -pthread -Wl,--export-dynamic -o"test" ./main.o -lm -ldl -lmpi -lopen-rte -lopen-pal -lnsl -lutil
./main.o: In function `main':
/home/djunderw/ncsu/workspace/test/Debug/../main.cpp:20: undefined reference to `MPI::COMM_WORLD'
/home/djunderw/ncsu/workspace/test/Debug/../main.cpp:21: undefined reference to `MPI::COMM_WORLD'
./main.o: In function `__static_initialization_and_destruction_0':
/usr/include/c++/4.4/iostream:72: undefined reference to `std::ios_base::Init::Init()'
/usr/include/c++/4.4/iostream:72: undefined reference to `std::ios_base::Init::~Init()'
.......
私は.......
上記でエラーメッセージが続くという事実を示すために使用しました-それらのかなりの数がありますが、ここに表示するためにそれらすべてが必要であるとは思いません。もしそうなら、聞いてください、そして私はそれらをすべて貼り付けます。
私の疑いは、私のリンカーフラグが正しい順序になっていないことです。 別のスレッドがその結論に達します:MPIコードにG++を使用している間のリンクエラー。しかし、もしそうなら、私は何が故障しているのか理解できません。
リンクが失敗するのはなぜですか?