无法在 Windows 10 上将 libcurl 与 cffi 一起使用
Unable to use libcurl with cffi on Windows 10
我正在 Windows 10 上玩 CFFI tutorial 并使用 msys2 安装了 libcurl-devel
包。我在目录 c:\msys2\usr\lib\
中找到了一个文件 libcurl.dll.a
,并使用以下命令将此目录添加到 *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
) 文件之间差异的任何进一步信息,目前没有资源来进一步调查这一点。
尝试加载 load-foreign-library
,而不是使用 use-foreign-library
。它是较低级别的代码,但可以让您试验文件和路径。
还可以使用 cygcheck 找出 libcurl.dll
所依赖的内容。然后确保安装了组件,并且它们位于 PATH
.
最后,检查 libcurl.dll 在您的 MSYS2 中的位置。在我的系统上它位于 /c/msys64/mingw64/bin/libcurl-4.dll
我正在 Windows 10 上玩 CFFI tutorial 并使用 msys2 安装了 libcurl-devel
包。我在目录 c:\msys2\usr\lib\
中找到了一个文件 libcurl.dll.a
,并使用以下命令将此目录添加到 *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
) 文件之间差异的任何进一步信息,目前没有资源来进一步调查这一点。
尝试加载 load-foreign-library
,而不是使用 use-foreign-library
。它是较低级别的代码,但可以让您试验文件和路径。
还可以使用 cygcheck 找出 libcurl.dll
所依赖的内容。然后确保安装了组件,并且它们位于 PATH
.
最后,检查 libcurl.dll 在您的 MSYS2 中的位置。在我的系统上它位于 /c/msys64/mingw64/bin/libcurl-4.dll