使用 G++ 时出现链接错误对于 MPI 代码

发布于 2024-11-16 13:37:45 字数 1471 浏览 3 评论 0原文

我的代码就这么简单:

#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

My code is as simple as this:

#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();
}

I first compile it to object file:

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

Then I can easily use mpicxx:

mpicxx src/mpitest.o -o mpi

But I want to use g++ instead, because It's easier for automake, so I tried:

mpicxx src/mpitest.o -o mpi -show

It prints out:

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

And yes, that command actually does the same thing successfully. However, If I tried to change it to (I just change the object file and output to the end):

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

Which is what automake does when it adds LDFLAGS, the g++ start complaining...

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

What happens with g++ ? I couldn't figure out. Please enlighten me. Why the order here matter at all ? What is the proper way to do what I want from the beginning ?

Thanks a lot

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最美不过初阳 2024-11-23 13:37:45

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

I didn't really remember, maybe since version 4, library to link with -l must be passed after all source and object files.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文