1

我正在尝试创建一个使用 BLAS 和 LAPACK C 扩展的 Python 轮子。在 Ubuntu 下编译此类包需要以下系统包:

  • libopenblas-dev: (Open)BLAS 开发库
  • liblapack-dev: LAPACK 开发库
  • liblapacke-dev: LAPACK 的 C 标头

这很好用,但现在我需要在 CentOS 5 下重复这个过程。原因是我正在尝试创建一个 manylinux 轮子,推荐的方法似乎是使用旧的 CentOS 工具链来保证它可以在不同的 linux 发行版下工作.

问题是,虽然在 CentOS 5(libopenblas-dev和)中有等价物,但. 考虑到这些软件包中提供的 LAPACK 版本非常旧(3.0),这似乎是有道理的,它似乎不支持 lapacke。但正因为如此,我无法编译我的软件,因为 gcc 抱怨缺少 lapacke.h 头文件。liblapack-devopenblas-devellapack-develliblapacke-dev

我尝试过的事情:

  • 手动下载和编译更新的 LAPACK 版本(3.8.0 和 3.6.0)。我得到编译错误。
  • 直接将 lapacke.h 标头从上述 LAPACK 版本之一复制到 /usr/include。没用,可能是因为 LAPACK 版本的不同。
  • 按照官方说明添加英特尔 MKL 存储库,并将 BLAS/LAPACK 替换为 MKL。不幸的是 CentOS 5 不包含 中的--add-repo选项yum-config-manager,所以我在这里有点不知所措。
4

1 回答 1

0

CentOS 5.0 不支持 lapacke,因此 C 接口不可用,但您仍然可以通过调用 fortran 符号来解决问题。

首先,为 BLAS 和 LAPACK 安装 CentOS 软件包

yum install -y blas-devel lapack-devel

并将这些库添加到链接器路径

export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/lib64"

现在,您应该能够通过导入 fortran 符号在您的 C/C++ 扩展代码中使用 BLAS 和 LAPACK 函数。例如,要dpttrs在 C++ 源代码中使用 LAPACK 函数,您需要将其声明为外部 C 符号

extern "C" {
    void dpttrs_(lapack_int* n, lapack_int* nrhs, const double* d, const double* e, 
                 double* b, lapack_int* ldb, lapack_int *info );
}

dpttrs_然后调用该函数就可以正常使用了。

最后,在打包 python 包时,请确保包含blaslapack库和头文件。例如,使用 cffi 时,您应该按照以下模式配置源

ffi.set_source(
    'YOUR MODULE NAME',
    "BASE SOURCES",
    sources=sources,
    source_extension='.cpp',
    libraries=['blas', 'lapack'],
    include_dirs=['/usr/include']
)
于 2018-11-24T13:10:35.160 回答