如果我用C ++编写了一个库,并且绑定了C, Ada, Fortran, D
&其他编译语言。
即使它们使用相同的函数名,所有这些绑定都可以与C ++编译的代码在同一个二进制文件中吗?
你可以使用像这样的绑定吗?
答案 0 :(得分:1)
您可以将C ++与C链接起来,前提是您只调用C样式函数(在对象之外)并通过“extern C”在标题中关闭名称。特别是如果您使用相同的编译器。如果使用不同的obj格式,不同的编译器将导致问题。我不知道ADA / Fortran / D,但我怀疑答案是否定的,至少直接通过.LIB或.OBJ文件。在Windows上,如果ADA / FORTRAN / D支持动态链接(或者你可以调用windows api LoadLibrary),你可以尝试通过DLL。
这不是一件容易的事情,我对细节进行了掩饰。如果你真的要尝试,那么你需要具体说明你正在使用哪些平台和编译器,我会尝试更具体。
答案 1 :(得分:1)
根据您创建绑定的方式,可能甚至不需要库:
例如,使用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()。
答案 2 :(得分:1)
是。一个例子(稍微颠倒)是PlPlot;它是用C语言编写的,并且绑定了Ada,C ++,D,Fortran77,Fortran95,Java,Lua,OCaml,Python,......