2

依存する動的外部ライブラリが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)
4

1 に答える 1

0

試行錯誤の末、自分のコードが常に asdf:load-system で動作することを確認する方法を見つけました。重要なのは、ライブラリの定義と cffi:*foreign-library-directories の更新を eval-when 形式でラップすることでした。

(eval-when
    (:compile-toplevel :load-toplevel :execute)
  (pushnew #P"/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))

コメントで pushnew の提案を反映するように編集されたコード

于 2016-10-08T13:14:41.453 に答える