2013-03-11 8 views
6

SWIG tutorial करना, और example.c का उपयोग करना, example.i जैसा कि उन्होंने वहां प्रदान किया था। मैंने swig -cffi example.i के साथ lisp फ़ाइल जेनरेट की।सीएल और एसडब्ल्यूआईजी: उदाहरण उदाहरण?

लेकिन जब मैं एसबीसीएल के साथ test.lisp चलाता हूं, तो मुझे example.lisp संकलित करते समय अपरिभाषित विदेशी फ़ंक्शन के साथ-साथ शिकायतें भी मिलती हैं। मुझे पूरा यकीन है कि मुझे अभी भी अपनी example.c को लाइब्रेरी में संकलित करना है और फिर किसी भी तरह से इसे लोड करने के लिए एसबीसीएल को बताएं! लेकिन this को छोड़कर दस्तावेज़ इस पर बहुत कम हैं।

क्या कोई मुझे बता सकता है कि यह कैसे करें या सीजीआईजी से सी/सी ++ स्रोतों से सीएफएफआई बाइंडिंग स्वचालित रूप से उत्पन्न करने के लिए बेहतर तरीका है ??

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

सबसे पहले, आप सी पुस्तकालय संकलित करने के लिए की जरूरत है। की तरह कुछ कार्य करें:

gcc -shared example.c -o libexample.so 

बेशक, एक जटिल मौजूदा पुस्तकालय संकलन के लिए काफी अधिक जटिल हो सकता है - यदि आप किसी मौजूदा पुस्तकालय लपेटकर कर रहे हैं, यह शायद आप इसे निर्माण में मदद करने Makefile के कुछ प्रकार के साथ आता है।

फिर, लिस्प में, लाइब्रेरी को परिभाषित और लोड करने के लिए CFFI का उपयोग करें। ऐसा लगता है कि आप मुख्य भाग हैं।

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

इस भाग:

(t (:default "libexample")) 

एक सशर्त जो आप विभिन्न प्लेटफार्मों के लिए विभिन्न लोडिंग निर्देश देने के लिए उपयोग कर सकते हैं। (टी ...) कैचल विकल्प है, जो कि COND के साथ है। आप परिभाषित-विदेशी पुस्तकालय के लिए प्रलेखन में सटीक वाक्यविन्यास पा सकते हैं।

अब आप आमतौर पर पुस्तकालय में कार्यों को परिभाषित करने के लिए cffi: defcfun का उपयोग करेंगे। यह वही है बड़ा घूँट-उत्पन्न फ़ाइल आप के लिए करता है, इसलिए इसे लोड:

(load "example.lisp") 

अब आप सामान्य लिस्प कार्यों के रूप में कार्य करता है कॉल कर सकते हैं:

(fact 5) 
    => 120 
+1

सुंदर। मुझे भी LD_LIBRARY_PATH सेट करना पड़ा ताकि मेरा libexample.so पाया जा सके। आप इसे अपने उत्तर में जोड़ना चाह सकते हैं। –

संबंधित मुद्दे