使用G ++进行MPI代码时链接错误

时间:2011-06-23 08:35:07

标签: g++ mpi automake

我的代码就像这样简单:

#include <mpi.h>
int main(int argc, char**args) {
    MPI_Init(&argc, &args);
    int mpiSize;
    int mpiRank;
    MPI_Comm_size(MPI_COMM_WORLD, &mpiSize);
    MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank);
    MPI_Finalize();
}

我首先将其编译为目标文件:

g++ -c src/mpitest.cpp -o src/mpitest.o

然后我可以轻松使用mpicxx:

mpicxx src/mpitest.o -o mpi

但是我想使用g ++,因为它对automake更容易,所以我尝试了:

mpicxx src/mpitest.o -o mpi -show

打印出来:

g++ src/mpitest.o -o mpi -I/usr/local/include -L/usr/local/lib -L/usr/local/lib -lmpichcxx -lmpich -lopa -lpthread -lrt

是的,该命令实际上成功地做了同样的事情。但是,如果我尝试将其更改为(我只是更改目标文件并输出到结尾):

g++ -I/usr/local/include -L/usr/local/lib -L/usr/local/lib -lmpichcxx -lmpich -lopa -lpthread -lrt src/mpitest.o -o mpi

这就是automake在添加LDFLAGS时所做的事情,g ++开始抱怨......

src/mpitest.o: In function `main':
..src/mpitest.cpp:5: undefined reference to `MPI_Init'
../src/mpitest.cpp:8: undefined reference to `MPI_Comm_size'
../src/mpitest.cpp:9: undefined reference to `MPI_Comm_rank'
../src/mpitest.cpp:10: undefined reference to `MPI_Finalize'
collect2: ld returned 1 exit status

g ++会发生什么?我弄清楚了。请赐教。为什么这里的订单很重要?从一开始就做我想做的事的正确方法是什么?

非常感谢

p / s:g ++ --version g ++(Ubuntu 4.4.3-4ubuntu5)4.4.3 mpi是mvapich2

1 个答案:

答案 0 :(得分:1)

我真的没记错,也许从版本4开始,必须在所有源文件和目标文件之后传递与-l链接的库。