创建一个C++;Python的MPI模块,导入错误 我有一个Python模块,它封装了一个C++库。该库使用MPI,并使用mpicxx编译。在某些机器上,一切都很好,但在其他机器上,我发现: ImportError: ./_pyCombBLAS.so: undefined symbol: _ZN3MPI3Win4FreeEv

创建一个C++;Python的MPI模块,导入错误 我有一个Python模块,它封装了一个C++库。该库使用MPI,并使用mpicxx编译。在某些机器上,一切都很好,但在其他机器上,我发现: ImportError: ./_pyCombBLAS.so: undefined symbol: _ZN3MPI3Win4FreeEv,python,mpi,undefined-symbol,Python,Mpi,Undefined Symbol,因此,MPI库中有一个未定义的符号。据我所知,mpicxx应该链接所有内容,但它没有。知道为什么吗?这是一个共享库问题。在扩展模块工作的系统和出现故障的系统上,尝试在扩展模块上运行ldd ldd _extension.so 这将显示扩展所依赖的所有库,以便确保它们可用 解决此问题的一个简单方法可能是将依赖项静态链接到扩展中。结果表明,错误在于加载了错误的库。 正如您所知,一个集群可能安装了多个版本的MPI,有时使用多个编译器编译同一版本。这些文件都可能具有相同的文件名。在我的例子中,即使我使用

因此,MPI库中有一个未定义的符号。据我所知,mpicxx应该链接所有内容,但它没有。知道为什么吗?

这是一个共享库问题。在扩展模块工作的系统和出现故障的系统上,尝试在扩展模块上运行ldd

ldd _extension.so
这将显示扩展所依赖的所有库,以便确保它们可用


解决此问题的一个简单方法可能是将依赖项静态链接到扩展中。

结果表明,错误在于加载了错误的库。 正如您所知,一个集群可能安装了多个版本的MPI,有时使用多个编译器编译同一版本。这些文件都可能具有相同的文件名。在我的例子中,即使我使用MPICH GNU编译,默认路径还是指向OpenMPI PGI库。我没有意识到这一点,我认为使用MPICH GNU编译意味着可以在运行时找到MPICH GNU库

当然,我不能实际使用PGI编译的OpenMPI,因为Python是用GCC编译的,PGI不会发出与GCC完全兼容的二进制文件


解决方案是设置LD_LIBRARY环境变量以匹配用于编译代码的MPI发行版。

ZN3MPI3Win4FreeEv定义为
libmpi_cxx。因此
,因此,您必须链接到
-lmpi\u cxx
而不是
-lmpi

您能确认不工作的机器是否有MPI-2吗?它有mpich、mpich2、OpenMPI和SUNWhpc。编译器包括gnu、pgCC和intel。所有排列都不起作用。无论如何,不建议手动链接MPI。应该使用mpicc/mpicxx,它们是提供正确编译器标志的精简包装。我使用MPICXX,所以应该链接到C++库。