为Python创建C++ MPI模块时,导入错误
我有一个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版本。