c++ - 库可以包含多个绑定(bind)吗

标签 c++ c binary ada

如果我用 C++ 编写了一个库,并且绑定(bind)了 C、Ada、Fortran、D 和其他编译语言。

所有这些绑定(bind)是否可以与 C++ 编译代码位于同一二进制文件中,即使它们使用相同的函数名称?

你能像这样使用绑定(bind)吗?

最佳答案

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

  • 绑定(bind)编写了一些解释器特定的 API:

例如,使用 MRI API 编写的 ruby​​ 扩展基本上是一个共享库,提供:

void init_Modulename()

此函数然后使用 MRI api,如 rb_define_module、rb_define_class、rb_define_method 等来包装 C/C++ API。确保这个函数被 extern "C"包围,这样它的名字就不会以 C++ 的方式被破坏。

通常此共享库会链接到您正在绑定(bind)的库,但没有什么能阻止它们是同一个共享库。

  • 在运行时完成绑定(bind)

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

  • 使用生成器完成的绑定(bind)

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

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

关于c++ - 库可以包含多个绑定(bind)吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855141/

相关文章:

c++ - 如何使用 extern 关键字正确初始化 struct[int]

c++ - 添加 endl 修复代码

c++ - 按值传递的结构,在 C -> C++ 回调函数 (gcc 4.1) 期间损坏

c# - 重构速度 : Convert To a Date

c++ - 使用 libvpx 编译项目时 undefined reference

c - 如果文件的内容为 EOF,如何将文件复制到内存中?

c/中断的系统调用/fork 与线程

javascript - 具有不精确二进制表示形式的递增 float 组

binary - 八进制全加法器

c++ - 让 Cairo 图形与 MFC 一起工作的小例子?