6

SWIGチュートリアルを実行し、そこで提供されている example.c、example.i を使用します。でlispファイルを生成しましswig -cffi example.iた。

しかし、test.lispSBCL で実行すると、未定義のエイリアン関数についての苦情と、example.lispそれ自体をコンパイルする際の苦情が発生します。私の example.c をライブラリにコンパイルしてから、どうにかして SBCL にそれをロードするように指示する必要があると確信しています! しかし、これを除いて、ドキュメントはこれについて非常に乏しいです

誰かがこれを行う方法を教えてもらえますか、または SWIG よりも C/C++ ソースから CFFI バインディングを自動的に生成するためのより良い方法はありますか??

sbcl 出力:

...
; 
; caught STYLE-WARNING:
;   Undefined alien: "fact"
; 
; compilation unit finished
;   caught 1 STYLE-WARNING condition
; 
; caught STYLE-WARNING:
;   Undefined alien: "my_mod"
...

test.lisp

;call C functions defined in example.c

(require :cffi)
;;;(require :example "example.lisp")
(load "example.lisp")
(fact 2)
(quit)
4

1 に答える 1

9

まず、C ライブラリをコンパイルする必要があります。次のようにします。

gcc -shared example.c -o libexample.so

もちろん、既存のライブラリが複雑な場合、コンパイルはかなり複雑になる可能性があります。既存のライブラリをラップする場合は、ビルドに役立つ何らかの Makefile が付属している可能性があります。

次に、Lisp で CFFI を使用してライブラリを定義およびロードします。これはあなたが見逃している主要な部分のようです。

(cffi:define-foreign-library libexample
    (t (:default "libexample"))) ;; note no .so suffix here
(cffi:use-foreign-library libexample)

この部分:

(t (:default "libexample"))

プラットフォームごとに異なるロード命令を与えるために使用できる条件です。(t ...) は、COND とよく似た包括的なオプションです。define-foreign-library のドキュメントで正確な構文を見つけることができます。

ライブラリ内の関数を定義するには、通常、cffi:defcfun などを使用します。これは、SWIG によって生成されたファイルが行うことなので、ロードします。

(load "example.lisp")

関数を通常の Lisp 関数として呼び出すことができます:

(fact 5)
  => 120
于 2013-03-11T20:08:15.610 に答える