2013-03-11 4 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 

- 기존 라이브러리를 포장하는 경우, 아마 당신이 그것을 구축 할 수 있도록 메이크 어떤 종류의와 함께 제공 : 같은 작업을 수행합니다.

그런 다음, 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 등을 사용하여 라이브러리의 함수를 정의합니다. 이는 꿀꺽 꿀꺽 생성 된 파일이 당신을 위해 무엇을, 그래서로드 :

(load "example.lisp") 

이제 정상적인 리스프 함수로 함수를 호출 할 수 있습니다

(fact 5) 
    => 120 
+1

아름다운. 또한 내 libexample.so를 찾을 수 있도록 LD_LIBRARY_PATH를 설정해야했습니다. 이 질문을 답안에 추가 할 수 있습니다. –