CFFI 不加载依赖库?

Dr.*_*ain 4 windows sbcl common-lisp blas cffi

我正在尝试使用来自 SBCL 的 BLAS/LAPACK 库(特别是试图让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")
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,这并不可怕,但我不明白为什么 CFFI:LOAD-FOREIGN-LIBRARY 无法找到并加载依赖项本身。难道我做错了什么?

jla*_*ahd 5

在您的情况下,可能不是 CFFI 而是Windows DLL 搜索规则导致了这种情况。

cygblas-0.dllc:\cygwin64\lib\lapack目录中一样,它可能具有的任何依赖项都从同一目录、当前目录、Windows 目录和PATH.

如果您c:\cygwin64\bin的路径中没有,则无法找到 DLL。cffi::*foreing-library-directories*不影响 Windows 功能;CFFI 只是LoadLibrary使用 DLL 的完整路径执行调用。

作为解决方案,我建议您配置您PATHc:\cygwin64\bin目录以包含该目录,这在任何情况下都是一个好主意。或者,您可以PATH在调用 之前修改代码中的环境变量load-foreign-library,但其完成方式取决于实现