【问题标题】:wrapping C or C++ library what are the advantages and disavantages包装 C 或 C++ 库有哪些优缺点
【发布时间】:2014-10-30 16:47:20
【问题描述】:

我正在编写一些库,我希望它们可以在 C 和 C++ 中使用,然后用 swig 包装它们以使它们可用于 Ruby、Python、Java、Lisp,...

用 C 编写库然后用 C++ 包装库而不是用 C++ 编写然后用 C 包装有什么优点和缺点?

我能想到的唯一事情是如果库是用 C++ 编写的,那么 C 程序可能需要一个 C++ 编译器来编译,尽管我可能不正确

可能还有一些功能或东西没有包装。

我主要是在寻求经验,以了解我在做这个项目时可能会遇到什么。

【问题讨论】:

  • C++ 没有稳定的 abi,​​很少有语言可以链接到它,同一编译器的不同版本甚至可能无法链接。 C 有一个稳定的 abi,​​几乎每种语言都有一个 C ffi。
  • @sjdowling,这是一个很好的观点,但据说 swig 可以为所有语言包装 C++,尽管我不确定它是如何工作的
  • 这还取决于您的图书馆的组织方式。如果它(意味着它的用户界面)严重依赖模板,您将不得不手动实例化所有模板以将它们包装起来,这对于您的应用程序可能实用,也可能不实用。除此之外,“稳定的 ABI”当然是一个论点。但是 SWIG 非常擅长包装 C++ 代码。据我了解,它创建的附加接口库(然后从 Python 等访问)导出 C ABI,因此 C++ API 的困难不会对目标语言可见。
  • 我必须承认,我的经验仅限于为 Python 包装 C/C++(不适用于您提到的任何其他语言)。将自己限制为 C 肯定是一个安全的选择,但 SWIG 具有 STL 容器的所有不错的包装器,并提供了将自定义类中的运算符轻松映射到 Python 中的等效结构的方法,因此,如果面向对象是你的库的一个重要概念,首先包装 C++ 可能比将自己限制在 C 中然后在目标语言中“重建”良好的结构更容易。
  • 另一个想法:既然你知道你要包装这个库,那么在编写代码时检查你是否处于 SWIG 的能力范围内应该相对容易。它可能不会施加很多限制(请参阅here),但这样可以最大限度地减少对手动解决方法的需求。当您决定包装一个经过几年开发而没有考虑到这个想法的库时,事情通常会变得更加混乱。

标签: c++ c binding shared-libraries wrapper


【解决方案1】:

用 C 编写,用 C++ 包装:

优势

  • 如果您的 C 代码在某种程度上是面向对象的,或者根本不执行任何宏和类似技巧,那么制作 C++ 包装器应该很容易
  • 实际上,您可以使用 SWIG 或类似工具制作 C++ 包装器,然后使用相同的工件(如 SWIG 接口文件)制作其他(Ruby、Python...)包装器
  • 如果您对要连接的语言(例如 Ruby 和 Python,但不是 Lisp 或其他语言)有想法,那么您可以编写 C++ 包装器,以便更轻松地为这些语言编写包装器(即使没有 SWIG)

缺点

  • 制作 C++ 包装器时可能会陷入困境,这种包装器过于 C++ 风格(例如,模板太多),而这可能很难用另一种语言进行包装
  • 只有少数语言支持直接连接 C++,尤其是整个 C++。因此,您几乎需要为其他语言编写包装器。

用 C++ 编写,用 C 换行:

优势

  • C 是一种更易于交互的语言,因为它是一种更简单的语言,并且大多数环境/操作系统都是用 C 编写的。

  • 实际上,如果您遵循一些约定(“ABI”),大多数语言都提供了一种调用 C DLL/.so 的方法,根本不需要任何包装器。在大多数情况下,它很丑陋,但可以很好地用于更简单的接口、原型等。

缺点

  • 与 C 的接口并不像“馅饼”那么“容易”,因此如果您不小心,可能会遇到麻烦。例如,在 Windows 上,要从 DLL 导出函数,您必须将其标记为“已导出”,这只有“事实上的”标准方式。还有结构对齐、枚举大小和其他问题。

  • 从 C 中连接 C++ 比反之更难。你必须确保你的异常不会从 C++ 传播,正确地“翻译”C++ 模板(记住 std::string 是一个模板),各种继承习惯用法(接口,混合,“常规”多重继承...... ) 在界面中...

我的建议

我都做过,我的经验建议您应该使用更适合您手头任务的语言编写模块。完成后,与另一个接口,然后包装到所有其余部分。实际上,没有人会阻止您将 C 接口从一种语言(比如 Ruby)和 c++ 从另一种语言(比如 Python - 使用 Cython)包装起来。

C 和 C++ 之间的交互比将它们中的任何一个与(几乎所有)其他语言交互要容易得多,因此在决定主要开发语言时不应该有非常重要的影响。

【讨论】:

  • 这是一个非常好的答案,尽管在您列出的“用 C++ 编写,用 C 包装”的优势下,有一点对我来说似乎有点不对劲,您列出 C 比谈论 C ABI 更容易。这不应该是 C++ 的优势吗?
  • 我的意思是这是使用 C 作为接口语言的优势(因此 C++ 是实现语言)。
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2023-03-28
  • 2010-11-30
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多