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 не может найти и загрузить зависимости самостоятельно. Я делаю что-то неправильно?


person Dr. Pain    schedule 06.03.2014    source источник


Ответы (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, но путем это сделано, зависит от реализации.

person jlahd    schedule 06.03.2014
comment
Спасибо за ответ. Я предполагал, что добавление каталогов в cffi:*foreign-library-directories* добавит их к пути поиска загрузки, но если нет, то это объясняет проблему. - person Dr. Pain; 06.03.2014