我想为C库(SOIL)生成一个常见的lisp cffi包装器,而我对cl& cffi我不确定使用哪些库或如何开始使用它们。 基本上我会问一个更详细的问题,但不知道我不知道的。
答案 0 :(得分:3)
[更新]这已经过时了。这些天我建议您查看cl-autowrap或cffi/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文档)
...但是,你可以经常离开而不写一个让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函数填充的函数,您希望隐藏这些函数。
这是一个开始的地方,希望你可以在这里工作。 侨