依存する動的外部ライブラリがcffiを使用して自動的にロードされるように、.asdファイルのオプションまたはその他の方法でプロジェクトをセットアップする慣用的な方法を探しています。
これが私が試していることです: armadillo.lisp というファイルに
;;; Load the Armadillo Libraries
(push "/users/mcheema/src/c++/lisp-armadillo/" cffi:*FOREIGN-LIBRARY-DIRECTORIES*)
(cffi:define-foreign-library lisp-armadillo-lib
(t "lisp-armadillo.dylib"))
(cffi:load-foreign-library 'lisp-armadillo-lib)
私が最初にスライムを起動するとき、私は入力します
(ql:register-local-projects)
(asdf:load-system :cl-armadillo)
これはエラーをスローします:
CL-USER> (asdf:load-system :cl-armadillo)
;Compiling "/Users/mcheema/src/lisp/cl-armadillo/src/armadillo.lisp"...;
Evaluation aborted on #<CFFI::FOREIGN-LIBRARY-UNDEFINED-ERROR #x3020017A461D>.
次に、上記と同じ cffi コード フラグメントを切り取り、スライム REPL に貼り付けると、次のようになります。
CL-USER> (push "/users/mcheema/src/c++/lisp-armadillo/" cffi:*FOREIGN-LIBRARY-DIRECTORIES*)
(cffi:define-foreign-library lisp-armadillo-lib
(t "lisp-armadillo.dylib"))
(cffi:load-foreign-library 'lisp-armadillo-lib)
#<FOREIGN-LIBRARY LISP-ARMADILLO-LIB "lisp-armadillo.dylib">
編集:ダークのコメントに答える。現在、specials.lisp と io.lisp は両方とも空のファイルであり、defpackage とプロジェクト全体のバージョン番号の 1 つのフォームを保存しています。
(in-package :cl-user)
(defpackage cl-armadillo-asdf
(:use :cl :asdf))
(in-package :cl-armadillo-asdf)
(defsystem cl-armadillo
:author "Munawar Cheema"
:license "LLGPL"
:version "0.0.1"
:depends-on (:uiop :cffi)
:components (
(module "src"
:components
((:file "armadillo" :depends-on ("io"))
(:file "io" :depends-on ("specials"))
(:file "specials"))))
:description "Create a simple interface to the armadillo library"
:long-description "Create a simple interface to the armadillo library"
; :in-order-to ((test-op (load-op cl-armadillo-test))) ; see fukamachi/cl-project.asd
)
armadillo.lisp も障害点に含めます
(in-package :cl-user)
(defpackage cl-armadillo
(:use
#:cl
#:uiop
#:cffi
#:cl-armadillo.specials
#:cl-armadillo.io)
(:nicknames :arm)
(:export matrix-destroy
matref
make-matrix-ones
make-matrix-randu
make-matrix-zeros
make-matrix-eye))
(in-package :cl-armadillo)
;;; Load the Armadillo Libraries
(push "/users/mcheema/src/c++/lisp-armadillo/" cffi:*FOREIGN-LIBRARY-DIRECTORIES*)
(cffi:define-foreign-library lisp-armadillo-lib
(t "lisp-armadillo.dylib"))
(cffi:load-foreign-library 'lisp-armadillo-lib)