lapacke.h 在 CentOS 5 中
lapacke.h in CentOS 5
我正在尝试创建一个使用 BLAS 和 LAPACK C 扩展的 Python 轮子。在 Ubuntu 下编译此类包需要以下系统包:
libopenblas-dev
:(打开)BLAS 开发库
liblapack-dev
:LAPACK 开发库
liblapacke-dev
:C headers for LAPACK
这很好用,但现在我需要在 CentOS 5 下重复这个过程。原因是我正在尝试创建一个 manylinux 轮子,而 a recommended way 似乎正在使用旧的 CentOS 工具链,以保证它可以在不同的 linux 发行版下工作。
问题是,虽然 libopenblas-dev
和 liblapack-dev
在 CentOS 5 中是等价的(openblas-devel
和 lapack-devel
),但 [=13= 没有等价的软件包].考虑到这些软件包中提供的 LAPACK 版本非常旧(3.0),似乎不支持 lapacke,这是有道理的。但正因为如此,我无法编译我的软件,因为 gcc 抱怨缺少 lapacke.h headers.
我尝试过的事情:
- 正在手动下载和编译较新的 LAPACK 版本(3.8.0 和 3.6.0)。我收到编译错误。
- 直接将 lapacke.h header 从上述 LAPACK 版本之一复制到 /usr/include。没用,可能是因为LAPACK版本不同。
- 在 official instructions 之后添加英特尔 MKL 存储库,并用 MKL 替换 BLAS/LAPACK。不幸的是 CentOS 5 在
yum-config-manager
中没有包含 --add-repo
选项,所以我在这里有点不知所措。
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 软件包时,确保包含 blas
和 lapack
库以及 headers。例如,当使用 cffi 时,您应该按照以下模式配置源
ffi.set_source(
'YOUR MODULE NAME',
"BASE SOURCES",
sources=sources,
source_extension='.cpp',
libraries=['blas', 'lapack'],
include_dirs=['/usr/include']
)
我正在尝试创建一个使用 BLAS 和 LAPACK C 扩展的 Python 轮子。在 Ubuntu 下编译此类包需要以下系统包:
libopenblas-dev
:(打开)BLAS 开发库liblapack-dev
:LAPACK 开发库liblapacke-dev
:C headers for LAPACK
这很好用,但现在我需要在 CentOS 5 下重复这个过程。原因是我正在尝试创建一个 manylinux 轮子,而 a recommended way 似乎正在使用旧的 CentOS 工具链,以保证它可以在不同的 linux 发行版下工作。
问题是,虽然 libopenblas-dev
和 liblapack-dev
在 CentOS 5 中是等价的(openblas-devel
和 lapack-devel
),但 [=13= 没有等价的软件包].考虑到这些软件包中提供的 LAPACK 版本非常旧(3.0),似乎不支持 lapacke,这是有道理的。但正因为如此,我无法编译我的软件,因为 gcc 抱怨缺少 lapacke.h headers.
我尝试过的事情:
- 正在手动下载和编译较新的 LAPACK 版本(3.8.0 和 3.6.0)。我收到编译错误。
- 直接将 lapacke.h header 从上述 LAPACK 版本之一复制到 /usr/include。没用,可能是因为LAPACK版本不同。
- 在 official instructions 之后添加英特尔 MKL 存储库,并用 MKL 替换 BLAS/LAPACK。不幸的是 CentOS 5 在
yum-config-manager
中没有包含--add-repo
选项,所以我在这里有点不知所措。
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 软件包时,确保包含 blas
和 lapack
库以及 headers。例如,当使用 cffi 时,您应该按照以下模式配置源
ffi.set_source(
'YOUR MODULE NAME',
"BASE SOURCES",
sources=sources,
source_extension='.cpp',
libraries=['blas', 'lapack'],
include_dirs=['/usr/include']
)