3

我目前正在学习在 Lisp 中包装 C++ 代码,以便可以从 Lisp 调用 C++ 函数。我正在学习 SWIG,我想了解更多关于 SWIG 的 Allegro Common Lisp 部分的信息。我现在正在使用 Allegro 的 Express(免费)添加,它的堆限制为 50mb,因此它阻止我加载用于 Lisp、GSLL 的 GNU 科学库。

我想制作一个巨大的应用程序,它将使用来自 GSLL 的代码、我用 SWIG 创建的 OpenCV 的 Lisp 包装器以及我用 SWIG 创建的 C++ 代码的其他 Lisp 包装器,我希望能够使用所有的 OpenCV来自 Lisp 和 SWIG 的 Allegro Common Lisp C++ 支持的 C++ 接口函数似乎是最完整的(如果我错了,请纠正我)和包装大多数 C++ 函数的最佳方式。(我这样说是因为SWIG 手册的 Allegro Common Lisp 部分比Common Lisp 部分大得多。

我在 Allegro Common Lisp Express 版本中为 Lisp 创建 OpenCV C++ 绑定,并以某种方式将它们移至 SBCL 或 CLISP,这样我就可以在没有堆限制或 Allegro/ 的 Lisp 实现中使用我的所有 GSLL 代码和我的 OpenCV 包装器SWIG 合作伙伴关系认为我只使用 Allegro 制作的 SWIG C++ 包装器和 Allegro Common Lisp 中的 SWIG Allegro 教程。

如果我错误地假设 Allegro Common Lisp 的支持比其他实现更完整,或者如果有更好的方法来包装所有 OpenCV 的 C++ 函数,或者 OpenCV 的 C 接口与 C++ 一样完整,请纠正我界面,我可以包装它。

请在相关时引用在线资源。

4

1 回答 1

0

针对 AllegroCL 的 SWIG 将生成特定于 Allegro 专有 FFI 的包装器,并且不能用于其他 lisp 实现。否则,用于 common-lisp 的 SWIG 可以生成针对 CFFI 的包装器,该包装器用作它支持的所有 lisp 外部接口的兼容层。然而,因此,CFFI 在受支持的 lisps 中往往是“最小公分母”,并且 SWIG 一代可能不会那么全面。

我的理解是,在 C++ 和 Common-Lisp 之间完全互操作并没有什么可以做的。我知道 ECL 的一些实验性分支试图这样做并声称取得了一定程度的成功,但我不相信这些达到了公开发布的程度。至少,如果你要走这条路,你会在一个支持非常非常有限的 lisp 平台上运行。

您可能希望考虑生成 C 包装器的另一个选项,它可能会提供更全面的结果,但它针对的是 CLANG 和 LLVM 编译器环境。如果这是可以接受的,您可以在 github 上查看以下两个项目:

我确定我没有给出您可能一直希望的答案,但我希望它至少可以提供一些帮助。

于 2014-01-25T21:23:05.087 回答