我正在运行64位的Ubuntu 11.04。我已经安装了OpenMPI。我正在尝试构建以下代码,这是来自Gropp / Lusk / Skjellum的“使用MPI”一书中的测试问题的片段:
#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()'
.......
我使用上面的.......
来表示错误消息继续发生的事实 - 它们中有很多,但我不认为它们都是必要的。如果是,请询问,我会将它们全部粘贴。
我的怀疑是我的链接器标志的顺序不正确。另一个线索得出的结论是:Link errors while using G++ for MPI code。但如果是这样,我无法弄清楚什么是乱序。
为什么我的链接失败?
答案 0 :(得分:11)
已解决:我将mpicc
更改为mpic++
,现在可以正常使用。
答案 1 :(得分:1)
您的文件是.c文件还是.cpp文件。问题是mpicc是c编译器而mpic ++是c ++编译器,所以如果你的是c程序,用C ++编译器编译它是不值得推荐的。