无法在Windows 10上将libcurl与cffi一起使用

时间:2019-06-12 08:33:15

标签: windows common-lisp msys2 cffi

我正在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>

1 个答案:

答案 0 :(得分:1)

请尝试加载use-foreign-library,而不是使用load-foreign-library。它是较低级的代码,但可让您试验文件和路径。

还可以使用cygcheck找出libcurl.dll所依赖的内容。然后,确保已安装组件,并且这些组件位于PATH中。

最后,检查libcurl.dll在MSYS2中的位置。在我的系统上,它位于/c/msys64/mingw64/bin/libcurl-4.dll