一个库可以包含多个绑定吗?

can a library contain multiple bindings

本文关键字:包含多 绑定 一个      更新时间:2023-10-16

如果我用c++写了一个库,并且为C, Ada, Fortran, D &其他编译语言。

所有这些绑定可以在同一个二进制与c++编译代码,即使他们使用相同的函数名称?

,你能像这样使用绑定吗?

根据您创建绑定的方式,可能甚至不需要库:

  • Bindings编写了一些解释器特定的api:
例如,使用MRI API编写的ruby扩展基本上是一个共享库,提供:
void init_Modulename()

这个函数然后使用MRI api,如rb_define_module, rb_define_class, rb_define_method等来包装C/c++ api。确保这个函数被extern "C"包围,这样它的名字就不会像c++那样混乱。

通常这个共享库与你要绑定的库相链接,但没有什么可以阻止它们是相同的共享库。

  • 运行时完成的绑定

例如在Ruby和其他解释器上使用FFI的绑定。绑定用相同的语言定义,并且FFI库知道如何在运行时调用目标库中的方法。因此,在这种情况下,绑定本身没有"库"。

  • 使用生成器完成的绑定

如果您使用生成器,如SWIG,它将扫描库头文件并生成各种语言的绑定。根据SWIG生成器如何实现这些目标(例如,Ruby使用上面描述的MRI API), SWIG将创建可以编译到自己库中的代码,但只要没有符号冲突,您也可以将其与库一起编译。

当我说符号冲突时,我不是指API本身,而是指绑定助手,如init_Modulename()。

你可以链接c++和C,只要你只调用C风格的函数(在对象之外),并通过"extern C"在头文件中关闭名称混淆。特别是如果您使用相同的编译器。不同的编译器如果使用不同的对象格式将会导致问题。我不知道ADA/Fortran/D,但我怀疑答案是否定的,至少直接通过。lib或。obj文件。在windows上,如果ADA/FORTRAN/D支持动态链接,您可以尝试通过DLL(或者您可以调用windows api LoadLibrary)。

这不是一件容易的事情,我掩盖了细节。如果你真的要尝试,那么你需要具体说明你正在使用的平台和编译器,我会尽量更具体。

是。一个例子是《PlPlot》;它是用C编写的,并绑定到Ada, c++, D, Fortran77, Fortran95, Java, Lua, OCaml, Python,…