为numpy安装lapack

30 投票
4 回答
29543 浏览
提问于 2025-04-17 10:33

我在使用 Ubuntu 11.10 和 python2.7 的时候,自己从源代码编译并安装了 numpy。但是当我尝试安装时,出现了以下问题:

ImportError: /usr/lib/liblapack.so.3gf: undefined symbol: ATL_chemv

问题出现在它试图从 numpy.linalg 导入 lapack_lite 的时候。我尝试从头开始重建 lapack,但似乎只生成了

/usr/local/lib/libblas.a
/usr/local/lib/liblapack.a
/usr/local/lib/libtmglib.a

和 .so 文件。请问 .so.3gf 是从哪里来的,我该如何解决这个问题呢?

4 个回答

4

这个问题出现的原因是你安装了libopenblas-baselibatlas3-base,但没有安装liblapack3。这几个软件包之间会产生冲突,因为它们各自安装的libblas.so(来自OpenBLAS)和liblapack.so(来自ATLAS)的版本不一样。

解决方案1(我最喜欢的):如果你同时安装liblapack3,那么你可以在你的电脑上保留OpenBLAS和ATLAS这两个软件。

sudo apt-get install liblapack3

解决方案2:卸载ATLAS(这样做会自动为你安装liblapack3,因为某些deb包的特殊操作)

sudo apt-get uninstall libatlas3-base

解决方案3:卸载OpenBLAS

sudo apt-get uninstall libopenblas-base


配置不当

$ dpkg -l | grep 'openblas\|atlas\|lapack'
ii  libatlas3-base                                        3.10.1-4                                            amd64        Automatically Tuned Linear Algebra Software, generic shared
ii  libopenblas-base                                      0.2.8-6ubuntu1                                      amd64        Optimized BLAS (linear algebra) library based on GotoBLAS2
$ update-alternatives --get-selections | grep 'blas\|lapack'
libblas.so.3                   auto     /usr/lib/openblas-base/libblas.so.3
liblapack.so.3                 auto     /usr/lib/atlas-base/atlas/liblapack.so.3
$ python -c 'import numpy'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/numpy/__init__.py", line 153, in <module>
    from . import add_newdocs
  File "/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "/usr/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 18, in <module>
    from .polynomial import *
  File "/usr/lib/python2.7/dist-packages/numpy/lib/polynomial.py", line 19, in <module>
    from numpy.linalg import eigvals, lstsq, inv
  File "/usr/lib/python2.7/dist-packages/numpy/linalg/__init__.py", line 50, in <module>
    from .linalg import *
  File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 29, in <module>
    from numpy.linalg import lapack_lite, _umath_linalg
ImportError: /usr/lib/liblapack.so.3: undefined symbol: ATL_chemv

解决方案1

$ dpkg -l | grep 'openblas\|atlas\|lapack'
ii  libatlas3-base                                        3.10.1-4                                            amd64        Automatically Tuned Linear Algebra Software, generic shared
ii  liblapack3                                            3.5.0-2ubuntu1                                      amd64        Library of linear algebra routines 3 - shared version
ii  libopenblas-base                                      0.2.8-6ubuntu1                                      amd64        Optimized BLAS (linear algebra) library based on GotoBLAS2
$ update-alternatives --get-selections | grep 'blas\|lapack'
libblas.so.3                   auto     /usr/lib/openblas-base/libblas.so.3
liblapack.so.3                 auto     /usr/lib/lapack/liblapack.so.3
$ python -c 'import numpy'

解决方案2

$ dpkg -l | grep 'openblas\|atlas\|lapack'
ii  liblapack3                                            3.5.0-2ubuntu1                                      amd64        Library of linear algebra routines 3 - shared version
ii  libopenblas-base                                      0.2.8-6ubuntu1                                      amd64        Optimized BLAS (linear algebra) library based on GotoBLAS2
$ update-alternatives --get-selections | grep 'blas\|lapack'
libblas.so.3                   auto     /usr/lib/openblas-base/libblas.so.3
liblapack.so.3                 auto     /usr/lib/lapack/liblapack.so.3
$ python -c 'import numpy'

解决方案3

$ dpkg -l | grep 'openblas\|atlas\|lapack'
ii  libatlas3-base                                        3.10.1-4                                            amd64        Automatically Tuned Linear Algebra Software, generic shared
$ update-alternatives --get-selections | grep 'blas\|lapack'
libblas.so.3                   auto     /usr/lib/atlas-base/atlas/libblas.so.3
liblapack.so.3                 auto     /usr/lib/atlas-base/atlas/liblapack.so.3
$ python -c 'import numpy'
9

根据我看到的一些错误报告,你可能安装了多个BLAS/ATLAS/LAPACK的提供者,比如ATLAS和OpenBLAS/GotoBLAS,这些可能会互相冲突。你可以看看这个:

$ ls -l /etc/alternatives/*.so.3gf

然后检查一下它们是否都对应同一个包(比如,它们都指向/usr/lib/atlas-base/

61

我之前也遇到过同样的问题,卸载 libopenblas-base 这个软件包就解决了。

sudo apt-get remove libopenblas-base

正如其他人已经解释过的,有几个软件包提供了不兼容的 liblapack.so.3gf 版本。

撰写回答