我最近意识到可以通过为该lib编写一个绑定器来使用为某种语言编写的库,而使用另一种语言。 我要解决的问题是如何真正写出活页夹。 有人可以写一个简短的例子来将C库(只有一个函数让我能够理解它)绑定到另一种语言吗?
非常感谢
答案 0 :(得分:3)
这在很大程度上取决于语言及其实现。大多数语言实现都很好地记录了如何将C函数与它们接口:
extern "C"
(但你需要小心,例如w.r.t.例外)code_chunk
- s,defprimitive
,{ {1}},defciterator
...)使这更容易。请注意,您应该如何进行界面在很大程度上取决于实现。 Memory management应该是一个特别关注的问题:许多语言都有garbage collector,你应该尊重它的不变量。同样,某些语言实现是多线程的,您应该尊重与线程相关的规则。有些实现需要一些特定的C接口来添加新的原语,其他实现则更灵活。一些实现允许回调(即语言函数调用你的C原语,它回调一些语言功能),但其他人不会。
另请注意,相同语言的两种不同实现(例如,CLISP和SBCL都是Common Lisp实现)具有不同的(通常是不兼容的)方式与C接口。
如Oliver Chalesworth所述,您可能会查看Swig内部,这可能会为您生成一些粘合代码。
我的感觉是,最重要的是要了解语言使用的垃圾收集器的约束。您可能(或不想)使用其finalization工具(例如,文件句柄或数据库句柄是通过GC内部的最终化隐式关闭,还是由用户调用的某个函数显式关闭?)。您可能希望阅读Garbage Collection Handbook以了解不同的GC技术。
GTK库有很多language bindings及其GObjectIntrospection图层声称可以促进语言绑定。您可能也会对libffi感兴趣(至少如果您正在实施某种语言)。