Невозможно использовать libcurl с cffi в Windows 10 - PullRequest
0 голосов
/ 12 июня 2019

Я играю с учебником CFFI в Windows 10 и установил пакет libcurl-devel с помощью msys2.Я нашел файл 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)

EDIT

Я использую SBCL 1.4.16 из пакета portacle.

РЕДАКТИРОВАТЬ 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.

Насколько я понимаю, по крайней мере, файл найден, но, похоже, не в правильном формате.Я не нашел никакой дополнительной информации о разнице между динамическими (.dll) и статическими (.dll.a) файлами в отношении cffi, и на данный момент у меня нет ресурсов для дальнейшего изучения этого.

1 Ответ

1 голос
/ 18 июня 2019

Вместо использования use-foreign-library попробуйте загрузить load-foreign-library.Это код более низкого уровня, но он позволит вам экспериментировать с файлами и путями.

Также используйте cygcheck, чтобы выяснить, от чего зависит libcurl.dll.Затем убедитесь, что у вас установлены компоненты и что они находятся в PATH.

Наконец, проверьте, где libcurl.dll живет в вашем MSYS2.На моей системе это в /c/msys64/mingw64/bin/libcurl-4.dll

...