2013-03-11 5 views
6

SWIG tutorialを実行し、そこに提供されているexample.c、example.iを使用します。私はswig -cffi example.iでlispファイルを生成しました。CLとSWIG:使用例?

しかし、SBCLでtest.lispを実行すると、example.lispをコンパイルするときに、定義されていないエイリアン機能についての苦情や苦情が出ます。私はまだ私のexample.cをライブラリにコンパイルしなければならないと確信して、何とかSBCLにロードするよう指示します!しかし、文書はthisを除いて、これにはほとんどいません。

誰かがこれを行う方法を教えてもらえますか、それとも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) 

答えて

8

まず、あなたは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 
+1

美しいです。私のlibexample.soが見つかるようにLD_LIBRARY_PATHを設定しなければなりませんでした。これをあなたの答えに加えたいかもしれません。 –

関連する問題