Я играю с учебником 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, и на данный момент у меня нет ресурсов для дальнейшего изучения этого.