0

我有一个包装 C++ 库的 Python 模块。该库使用 MPI 并使用 mpicxx 编译。在某些机器上一切都很好,但在其他机器上我得到了这个:

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

因此,MPI 库中有一个未定义的符号。据我所知,mpicxx 应该链接所有内容,但事实并非如此。任何想法为什么?

4

3 回答 3

1

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

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

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

于 2011-03-15T20:49:03.853 回答
0

这是一个共享库问题。尝试在它工作的系统和失败的系统上的扩展模块上运行 ldd。

ldd _extension.so

这应该向您显示您的扩展所依赖的所有库,以便您确保它们可用。

解决它的一种简单方法可能是将依赖项静态链接到您的扩展中。

于 2011-03-03T02:51:01.257 回答
0

符号ZN3MPI3Win4FreeEv定义为 is libmpi_cxx.so,因此必须链接 with-lmpi_cxx而不是-lmpi

于 2012-06-18T09:06:19.820 回答