我可以在SBCL或CLISP中使用用Allegro Common Lisp制作的C++包装器吗



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

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

我在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++接口一样完整,我可以包装它,请纠正我。

请引用相关的在线资源。

针对AllegroCL的SWIG将生成特定于Allegro专有FFI的包装器,并且在其他lisp实现中不可用。否则,通用lisp的SWIG可以生成针对CFFI的包装器,CFFI充当其支持的lisp的所有外部接口的兼容性层。然而,因此,CFFI往往是支持的Lisp中"最不常见的分母",SWIG生成可能不会那么全面。

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

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

  • http://github.com/rpav/c2ffi
  • http://github.com/rpav/c2ffi-cffi

我确信我还没有给出你可能一直希望的答案,但我希望它至少能有所帮助。

最新更新