CFFI не загружает зависимые библиотеки?

Я пытаюсь использовать библиотеки BLAS/LAPACK из SBCL (в частности, пытаюсь запустить пакет LLA). У меня было много проблем с загрузкой разделяемой библиотеки BLAS; в конце концов я обнаружил, что он не может загружать зависимые библиотеки. В конце концов я смог загрузить BLAS, загрузив все его зависимости вручную:

(setq cffi::*foreign-library-directories* '("C:/cygwin64/bin/" "C:/cygwin64/lib/lapack/"))
(CFFI:LOAD-FOREIGN-LIBRARY "CYGWIN1.DLL")
(CFFI:LOAD-FOREIGN-LIBRARY "CYGGCCC_S-SEH-1.DLL")
[..etc..]
(CFFI:LOAD-FOREIGN-LIBRARY "CYGBLAS-0.dll")

В качестве обходного пути это не страшно, но я не понимаю, почему CFFI:LOAD-FOREIGN-LIBRARY не может найти и загрузить зависимости самостоятельно. Я делаю что-то неправильно?

1 ответ

Решение

В вашем случае это, вероятно, не CFFI, а правила поиска Windows DLL, которые делают это возможным.

Как cygblas-0.dll находится в c:\cygwin64\lib\lapack каталог, любые зависимости, которые могут иметься, ищутся из того же каталога, текущего каталога, каталогов Windows и из PATH,

Если у вас нет c:\cygwin64\bin на вашем пути библиотеки DLL не могут быть найдены. cffi::*foreing-library-directories* не влияет на функциональность Windows; CFFI просто выполняет вызов LoadLibrary с полным путем к DLL.

В качестве решения, я предлагаю вам настроить PATH включить c:\cygwin64\bin каталог, который является хорошей идеей в любом случае. В качестве альтернативы, вы можете изменить PATH переменная окружения в вашем коде перед вызовом load-foreign-library, но способ, которым это сделано, зависит от реализации.

Другие вопросы по тегам