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



我想为C库(SOIL)生成一个通用的lisp-cffi包装器,虽然我对cl&cffi我不知道该使用什么库,也不知道如何开始使用它们。基本上我会问一个更详细的问题,但不知道我不知道什么。

[UPDATE]这已经过时了。这些天,我建议查看cl autowrap或cffi/c2fi


有一些包装生成器,但有两个名字从小组中脱颖而出,SWIG和Verrazano。


Verrazano现在还没有被维护,所以真的不应该被依赖,但是对于你使用SOIL库来说,它是有效的。。。有点下面的步骤是直接从使用带有普通口齿的kinect的示例中获得的。

首先,确保安装了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.lip文件中有了一个包装器。我立刻发现了问题,枚举的名称非常奇怪(.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-模块土壤。i

你会有一个新的soil.lip文件。与verrazano一样,请查看函数调用以查看枚举是如何使用的(或者更有可能没有使用)。


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

这是一个开始的地方,希望你能从这里开始工作。Ciao

最新更新