我有一个包装 C++ 库的 Python 模块。该库使用 MPI 并使用 mpicxx 编译。在某些机器上一切都很好,但在其他机器上我得到了这个:
ImportError: ./_pyCombBLAS.so: undefined symbol: _ZN3MPI3Win4FreeEv
因此,MPI 库中有一个未定义的符号。据我所知,mpicxx 应该链接所有内容,但事实并非如此。任何想法为什么?
我有一个包装 C++ 库的 Python 模块。该库使用 MPI 并使用 mpicxx 编译。在某些机器上一切都很好,但在其他机器上我得到了这个:
ImportError: ./_pyCombBLAS.so: undefined symbol: _ZN3MPI3Win4FreeEv
因此,MPI 库中有一个未定义的符号。据我所知,mpicxx 应该链接所有内容,但事实并非如此。任何想法为什么?
事实证明,错误在于加载了错误的库。如您所知,一个集群可能安装了多个版本的 MPI,有时同一版本会使用多个编译器进行编译。这些都可能具有相同的文件名。就我而言,即使我使用 MPICH GNU 进行编译,默认路径还是指向 OpenMPI PGI 库。我没有意识到这一点,我认为用 MPICH GNU 编译意味着 MPICH GNU 库会在运行时找到。
当然,我实际上不能使用 PGI 编译的 OpenMPI,因为 Python 是使用 GCC 编译的,而 PGI 不会发出与 GCC 完全兼容的二进制文件。
解决方案是设置 LD_LIBRARY 环境变量以匹配您用于编译代码的 MPI 发行版。
这是一个共享库问题。尝试在它工作的系统和失败的系统上的扩展模块上运行 ldd。
ldd _extension.so
这应该向您显示您的扩展所依赖的所有库,以便您确保它们可用。
解决它的一种简单方法可能是将依赖项静态链接到您的扩展中。
符号ZN3MPI3Win4FreeEv
定义为 is libmpi_cxx.so
,因此必须链接 with-lmpi_cxx
而不是-lmpi