我目前正在学习在Lisp中包装C ++代码,所以我可以从Lisp调用C ++函数。 我正在学习SWIG,我想更多地了解SWIG的Allegro Common Lisp部分。我现在正在使用快速(免费)添加Allegro,它的堆限制为50mb,因此它阻止我加载用于Lisp的GSU科学库,GSLL。
我想创建一个巨大的应用程序,它将使用来自GSLL的代码,OpenCV的Lisp包装器,我使用SWIG创建,以及我用SWIG创建的C ++代码的其他Lisp包装器,我希望能够使用所有OpenCV的C ++接口函数都来自Lisp和SWIG的Allegro Common Lisp C ++支持似乎是最完整的(如果我错了,请纠正我)以及包装大多数C ++函数的最佳方法。 (我这样说是因为the Allegro Common Lisp section of the SWIG manual比the Common Lisp sections大得多。
我在Allegro Common Lisp Express版本中为Lisp创建了OpenCV C ++绑定,并以某种方式将它们移动到SBCL或CLISP,因此我可以在没有堆限制的Lisp实现中使用我的所有GSLL代码和我的OpenCV包装器Allegro / SWIG合作伙伴认为我只使用Allegro制作的SWIG C ++包装器和Allegro Common Lisp中的SWIG Allegro教程。
如果我错误地认为Allegro Common Lisp的支持比其他实现更完整,或者如果有更好的方法来包装所有OpenCV的C ++函数或OpenCV的C接口是否完整,请纠正我作为C ++接口,我可以将其包装起来。
请在相关时引用在线资源。
答案 0 :(得分:0)
针对AllegroCL的SWIG将生成特定于Allegro专有FFI的包装器,并且不会在其他lisp实现上使用。否则,SWIG for common-lisp可以生成以CFFI为目标的包装器,它可以作为它支持的所有lisps外部接口的兼容层。因此,CFFI往往是受支持的lisps中的“最小公分母”,并且SWIG一代可能不会那么全面。
我的理解是,在C ++和Common-Lisp之间完全互操作并没有太多可以做的事情。我知道ECL的一些试验性分支试图这样做,但声称取得了一定程度的成功,但我不认为这些已达到公开发布的程度。至少,如果你要走这条路,那么你将在一个支持非常非常有限的lisp平台上运行。
您可能希望研究另一个选项,以生成可能提供更全面结果的C包装器,但这些选项针对CLANG和LLVM编译器环境。如果这是可以接受的,你可以在以下两个项目中查看github:
我确信我没有给出你可能希望得到的答案,但我希望它至少可以提供一些帮助。