【发布时间】:2013-07-09 08:33:47
【问题描述】:
我想为 C 库 (SOIL) 生成一个通用的 lisp cffi 包装器,虽然我对 cl 和 cffi 很有信心,但我不确定要使用哪些库或如何开始使用它们。 基本上我会问一个更详细的问题,但不知道我不知道什么。
【问题讨论】:
标签: common-lisp cffi
我想为 C 库 (SOIL) 生成一个通用的 lisp cffi 包装器,虽然我对 cl 和 cffi 很有信心,但我不确定要使用哪些库或如何开始使用它们。 基本上我会问一个更详细的问题,但不知道我不知道什么。
【问题讨论】:
标签: common-lisp cffi
[更新] 这已经过时了。这些天我建议查看cl-autowrap 或cffi/c2ffi
那里有一些包装器生成器,但有两个名称从该组中脱颖而出,SWIG andVerrazano。
Verrazano 现在没有维护,因此真的不应该依赖它,但是对于您使用 SOIL 库,它可以工作......有点! 以下步骤直接取自 using the kinect with common lisp 上的示例。
首先,确保您已安装 gcxml。对我来说,这是按如下方式完成的:
sudo apt-get install gccxml
现在在您的 repl 中(您可能需要根据您的系统编辑路径):
(ql:quickload :cffi)
(ql:quickload :verrazano)
(verrazano:generate-binding (list :cffi :package-name :soil :input-files (list "SOIL/SOIL.h")))
您现在在 soil.lisp 文件中有一个包装器。我马上就发现了问题,枚举的命名非常奇怪(.-1 .-2 等),并且这些相同的奇怪名称正在被导出。我删除了这些并重命名了枚举。然后您会发现函数调用中没有使用枚举,因此您需要修改“defcfun”调用以使用它们。
如果您不习惯这样做,我建议您找一个已经这样做的库作为指南。我发现 lispbuilder 在这方面有一些广泛的例子。
SWIG 绝对是更好的选择,即使使用复杂的库也能很好地为您服务。 一般的做法是编写一个 SWIG 接口文件,它告诉 swig 在哪里可以找到库以及要包装哪些功能。 SWIG 的文档非常广泛且非常好:
http://www.swig.org/Doc2.0/Contents.html#Contents
还可以查看他们在 Swig 和 Common Lisp 上的页面 http://www.swig.org/Doc2.0/Lisp.html
现在最好使用单独的接口文件,原因如下(取自 swig 文档)
...但是,您通常可以不写任何内容就离开,让 SWIG 解决。对于土壤,这涉及以下内容:
编写一个名为 soil.i 的文件并将以下内容放入其中(您可能需要更改路径)。
%module soil
%{
/* Includes the header in the wrapper code */
#include "/usr/include/SOIL/SOIL.h"
%}
/* Parse the header file to generate wrappers */
%include "/usr/include/SOIL/SOIL.h"
接下来在终端运行以下命令 swig -cffi -module soil soil.i
您将拥有一个新的 soil.lisp 文件。与 verrazano 一样,请查看函数调用以了解枚举是如何被使用的(或者更有可能没有被使用)。
现在有了这两个,你几乎肯定会想让事情变得更“口齿不清”。通常有一些指针传递给要由 C 函数填充的函数,您希望对用户隐藏这些指针。
这是一个开始的地方,希望你可以从这里开始工作。 咻
【讨论】: