如何为简单的c库生成cffi包装器

时间:2013-07-09 08:33:48

标签: common-lisp cffi

我想为C库(SOIL)生成一个常见的lisp cffi包装器,而我对cl& cffi我不确定使用哪些库或如何开始使用它们。 基本上我会问一个更详细的问题,但不知道我不知道的。

1 个答案:

答案 0 :(得分:3)

[更新]这已经过时了。这些天我建议您查看cl-autowrapcffi/c2ffi


有一些包装器生成器,但有两个名称从组中脱颖而出,SWIG and Verrazano


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")))

你现在在dirt.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文档)

  • 很少需要访问大型包中的每个功能。许多C函数可能在脚本环境中很少或没有用处。因此,为什么要包装它们?
  • 单独的接口文件提供了一个机会,可以提供有关如何构建接口的更精确的规则。
  • 接口文件可以提供更多的结构和组织。
  • 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土壤土壤.i

你将有一个新的soil.lisp文件。与verrazano一样,看一下函数调用,看看如何使用枚举(或者更有可能不使用它)。


现在有了这两个,你几乎肯定会想要让事情变得更加'lispy'。通常会有一些指针传递给要由C函数填充的函数,您希望隐藏这些函数。

这是一个开始的地方,希望你可以在这里工作。 侨