6

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++を使用している間のリンクエラー。しかし、もしそうなら、私は何が故障しているのか理解できません。

リンクが失敗するのはなぜですか?

4

2 に答える 2

16

解決済み: に変更mpiccしましたがmpic++、動作します。

于 2012-12-07T03:04:17.977 に答える
1

あなたのファイルは.cファイルまたは.cppファイルですか。問題は、mpiccはcコンパイラであり、mpic++はc++コンパイラであるため、acプログラムの場合、C++コンパイラでコンパイルすることはお勧めできません。

于 2015-02-13T12:48:57.880 に答える