我正在尝试创建一个使用BLAS和LAPACK C扩展的Python轮子。在Ubuntu下编译这样的包需要以下系统包:
libopenblas-dev
:(开放(BLAS开发库liblapack-dev
:LAPACK开发库- LAPACK的
liblapacke-dev
:C标头
这很好用,但现在我需要在Centos5下重复这个过程。原因是我正在尝试创建一个manylinux轮子,推荐的方法似乎是使用一个旧的CentOS工具链来保证它在不同的linux发行版下工作。
问题是,虽然libopenblas-dev
和liblapack-dev
在Centos5中具有等效性(openblas-devel
和lapack-devel
(,但liblapacke-dev
没有等效的包。考虑到这些包中提供的LAPACK版本非常旧(3.0(,似乎不支持lapacke,这是有道理的。但正因为如此,我无法编译我的软件,因为gcc抱怨缺少lapacke.h头文件。
我尝试过的东西:
- 手动下载并编译更新的LAPACK版本(3.8.0和3.6.0(。我收到编译错误
- 直接将上面某个LAPACK版本中的lapacke.h标头复制到/usr/include。不起作用,可能是因为LAPACK版本的差异
- 按照官方说明添加"英特尔MKL"存储库,并用MKL替换BLAS/LAPACK。不幸的是,CentOS 5在
yum-config-manager
中没有包含--add-repo
选项,所以我在这里有点不知所措
lapacke在CentOS 5.0中不受支持,因此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 );
}
然后通过调用CCD_ 12函数可以正常使用。
最后,在绑定python包时,请确保包括blas
和lapack
库和头。例如,当使用cffi时,您应该按照以下模式配置源
ffi.set_source(
'YOUR MODULE NAME',
"BASE SOURCES",
sources=sources,
source_extension='.cpp',
libraries=['blas', 'lapack'],
include_dirs=['/usr/include']
)