lapacke.h в CentOS 5
Я пытаюсь создать колесо Python, которое использует расширения BLAS и LAPACK C. Компиляция такого пакета под Ubuntu требует следующих системных пакетов:
libopenblas-dev
: (Открытые) библиотеки разработки BLASliblapack-dev
: Библиотеки разработки LAPACKliblapacke-dev
: C заголовки для LAPACK
Это хорошо работает, но теперь мне нужно повторить процесс под CentOS 5. Причина в том, что я пытаюсь создать колесо manylinux, и рекомендуемый способ - использовать старый набор инструментов CentOS, чтобы гарантировать, что он будет работать в разных дистрибутивах Linux.,
Проблема в том, пока libopenblas-dev
а также liblapack-dev
имеют эквиваленты в CentOS 5 (openblas-devel
а также lapack-devel
), эквивалентного пакета для liblapacke-dev
, Это имеет некоторый смысл, учитывая, что версия LAPACK, представленная в этих пакетах, очень старая (3.0), которая, похоже, не поддерживает lapacke. Но из-за этого я не могу скомпилировать свое программное обеспечение, так как gcc жалуется на отсутствие заголовков lapacke.h.
Вещи, которые я пробовал:
- Загрузка и компиляция новой версии LAPACK вручную (3.8.0 и 3.6.0). Я получаю ошибки компиляции.
- Непосредственное копирование заголовка lapacke.h из одной из версий LAPACK выше в /usr/include. Не работает, вероятно, из-за разницы в версиях LAPACK.
- Добавление репозиториев Intel MKL в соответствии с официальными инструкциями и замена BLAS/LAPACK на MKL. К сожалению, CentOS 5 не включает
--add-repo
вариант вyum-config-manager
так что я немного растерялся.
1 ответ
Lapacke не поддерживается в CentOS 5.0, поэтому интерфейс C недоступен, но вы все равно можете сделать это, вызвав символы fortran.
Сначала установите пакеты CentOS для BLAS и LAPACK
yum install -y blas-devel lapack-devel
и добавьте эти библиотеки в путь компоновщика
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/lib64"
Теперь вы должны иметь возможность использовать функции BLAS и LAPACK в своем коде расширений C/C++, импортируя символы фортрана. Например, чтобы использовать функцию LAPACK dpttrs
в источнике C++ вам нужно будет объявить его как внешний символ 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
библиотеки и заголовки. Например, при использовании cffi вы должны настроить свои источники в следующем порядке
ffi.set_source(
'YOUR MODULE NAME',
"BASE SOURCES",
sources=sources,
source_extension='.cpp',
libraries=['blas', 'lapack'],
include_dirs=['/usr/include']
)