【问题标题】:CL and SWIG: working example?CL 和 SWIG:工作示例?
【发布时间】:2013-03-12 04:14:57
【问题描述】:

做一个SWIG tutorial,并使用他们在那里提供的example.c、example.i。我用swig -cffi example.i 生成了lisp 文件。

但是当我使用 SBCL 运行 test.lisp 时,我收到关于 undefined alien 函数的抱怨,以及编译 example.lisp 本身时的抱怨。我很确定我仍然需要将我的 example.c 编译到一个库中,然后以某种方式告诉 SBCL 加载它!但是除了this 之外,文档对此非常缺乏。

有人能告诉我怎么做吗?或者有没有比 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)

【问题讨论】:

    标签: common-lisp swig sbcl


    【解决方案1】:

    首先,您需要编译 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
    

    【讨论】:

    • 漂亮。还必须设置 LD_LIBRARY_PATH 以便可以找到我的 libexample.so。您可能希望将此添加到您的答案中。
    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2011-11-14
    • 2021-11-03
    相关资源
    最近更新 更多