2013-03-11 11 views
6

Tun Sie eine SWIG tutorial, und verwenden Sie die example.c, beispiel.i, wie sie dort zur Verfügung gestellt. Ich habe eine Lisp-Datei mit swig -cffi example.i generiert.CL und SWIG: Arbeitsbeispiel?

Aber wenn ich test.lisp mit SBCL laufen, bekomme ich eine Beschwerde über undefined Alien-Funktion, sowie Beschwerden bei der Erstellung der example.lisp selbst. Ich bin mir ziemlich sicher, dass ich meine example.c noch in eine Bibliothek kompilieren muss und SBCL dann irgendwie anweisen muss, sie zu laden! Aber die Dokumente sind sehr spärlich, außer für this.

Kann mir jemand sagen, wie man das macht oder gibt es einen besseren Weg als SWIG, CFFI-Bindungen automatisch aus C/C++ - Quellen zu generieren?

sbcl Ausgang:

... 
; 
; 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) 

Antwort

8

Zuerst müssen Sie die C-Bibliothek kompilieren. So etwas wie:

gcc -shared example.c -o libexample.so 

Natürlich für eine komplexe bestehende Bibliothek Kompilation könnte wesentlich komplexer - wenn Sie eine vorhandene Bibliothek sind Einwickeln, es kommt wahrscheinlich mit irgendeiner Art von Makefile zu helfen, es zu bauen.

Verwenden Sie dann in Lisp CFFI zum Definieren und Laden der Bibliothek. Dies scheint der Hauptteil zu sein, den Sie vermissen.

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

Dieser Teil:

(t (:default "libexample")) 

ist ein bedingter, die Sie unterschiedliche Ladeanweisungen für verschiedene Plattformen zu geben, verwenden können. (t ...) ist die Catchall-Option, ähnlich wie bei COND. Die genaue Syntax finden Sie in der Dokumentation zu define-foreign-library.

Sie würden jetzt normalerweise cffi: defcfun und so weiter verwenden, um die Funktionen in der Bibliothek zu definieren. Dies ist, was die SWIG-generierte Datei für Sie tut, so laden Sie es:

(load "example.lisp") 

Sie können nun die Funktionen als normale Lisp-Funktionen aufrufen:

(fact 5) 
    => 120 
+1

schön. musste auch LD_LIBRARY_PATH setzen, damit mein libexample.so gefunden werden kann. Vielleicht möchten Sie dies zu Ihrer Antwort hinzufügen. –