为Python创建C++ MPI模块时,导入错误

0 投票
3 回答
1412 浏览
提问于 2025-04-16 12:52

我有一个Python模块,它是用来封装一个C++库的。这个库使用了MPI,并且是用mpicxx编译的。在某些机器上,一切都运行得很好,但在其他机器上,我遇到了这个问题:

ImportError: ./_pyCombBLAS.so: undefined symbol: _ZN3MPI3Win4FreeEv

所以这里出现了一个来自MPI库的未定义符号。根据我的理解,mpicxx应该把所有东西都链接进来,但它没有。有人知道为什么吗?

3 个回答

0

符号 ZN3MPI3Win4FreeEv 是在 libmpi_cxx.so 这个库里定义的,所以你需要用 -lmpi_cxx 来链接,而不是用 -lmpi

0

这是一个共享库的问题。你可以在正常工作的系统和出问题的系统上,分别运行一下 ldd 命令,看看扩展模块。

ldd _extension.so

这个命令会显示你的扩展模块依赖的所有库,这样你就可以确认这些库是否都能找到。

一个简单的解决办法是把这些依赖库静态链接到你的扩展模块里。

1

原来问题出在加载了错误的库上。你知道,一个集群里可能会安装好几个版本的MPI,有时候同一个版本还会用不同的编译器编译。这些库的文件名可能都是一样的。在我的情况下,虽然我用的是MPICH GNU编译的,但默认路径却指向了OpenMPI PGI的库。我没有意识到这一点,以为用MPICH GNU编译后,运行时就能找到MPICH GNU的库。

当然,我实际上不能使用PGI编译的OpenMPI,因为Python是用GCC编译的,而PGI编译的文件和GCC不完全兼容。

解决办法就是设置LD_LIBRARY环境变量,让它指向你用来编译代码的MPI版本。

撰写回答