我正在Windows 10上使用CFFI tutorial,并且已经使用msys2安装了libcurl-devel
软件包。我在目录libcurl.dll.a
中找到文件c:\msys2\usr\lib\
,并使用以下命令将该目录添加到*foreign-library-directories*
:
(pushnew #P"c:/msys64/usr/lib/" *foreign-library-directories*
:test #'equal)
但是,如果我尝试(use-foreign-library libcurl)
,则会出现以下错误:
Unable to load foreign library (LIBCURL).
Error opening shared object "libcurl.dll"
我想念什么?我试图直接指向libcurl.dll.a
,但错误保持不变:
(define-foreign-library libcurl
(:darwin (:or "libcurl.3.dylib" "libcurl.dylib"))
(:unix (:or "libcurl.so.3" "libcurl.so"))
(t "libcurl.dll.a"))
这是教程中给出的完整代码:
(asdf:load-system :cffi)
;;; Nothing special about the "CFFI-USER" package. We're just
;;; using it as a substitute for your own CL package.
(defpackage :cffi-user
(:use :common-lisp :cffi))
(in-package :cffi-user)
(pushnew #P"c:/msys64/usr/lib/" *foreign-library-directories*
:test #'equal)
(define-foreign-library libcurl
(:darwin (:or "libcurl.3.dylib" "libcurl.dylib"))
(:unix (:or "libcurl.so.3" "libcurl.so"))
(t (:default "libcurl")))
(use-foreign-library libcurl)
编辑
我正在使用portacle软件包中的SBCL 1.4.16。
编辑2
仅出于完整性考虑。如果我将define-foreign-library
更改为
(define-foreign-library libcurl
(:darwin (:or "libcurl.3.dylib" "libcurl.dylib"))
(:unix (:or "libcurl.so.3" "libcurl.so"))
(t "libcurl.dll.a"))
错误发生变化:
Unable to load foreign library (LIBCURL).
Error opening shared object "c:\\msys64\\usr\\lib\\libcurl.dll.a":
%1 ist keine zulässige Win32-Anwendung.
据我了解,至少找到了文件,但似乎格式不正确。我没有发现有关cffi的动态(.dll
)和静态(.dll.a
)文件之间差异的更多信息,并且目前没有资源对此做进一步的调查。 / p>
答案 0 :(得分:1)
请尝试加载use-foreign-library
,而不是使用load-foreign-library
。它是较低级的代码,但可让您试验文件和路径。
还可以使用cygcheck找出libcurl.dll
所依赖的内容。然后,确保已安装组件,并且这些组件位于PATH
中。
最后,检查libcurl.dll在MSYS2中的位置。在我的系统上,它位于/c/msys64/mingw64/bin/libcurl-4.dll