lapacke.h 在 CentOS 5 中

lapacke.h in CentOS 5

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

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

问题是,虽然 libopenblas-devliblapack-dev 在 CentOS 5 中是等价的(openblas-devellapack-devel),但 [=13= 没有等价的软件包].考虑到这些软件包中提供的 LAPACK 版本非常旧(3.0),似乎不支持 lapacke,这是有道理的。但正因为如此,我无法编译我的软件,因为 gcc 抱怨缺少 lapacke.h headers.

我尝试过的事情:

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 函数。例如,要在 C++ 源代码中使用 LAPACK 函数 dpttrs,您需要将其声明为外部 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 库以及 headers。例如,当使用 cffi 时,您应该按照以下模式配置源

ffi.set_source(
    'YOUR MODULE NAME',
    "BASE SOURCES",
    sources=sources,
    source_extension='.cpp',
    libraries=['blas', 'lapack'],
    include_dirs=['/usr/include']
)