包装C或C ++库有哪些优缺点

时间:2014-10-30 16:47:21

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

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

用C语言编写库然后用C ++包装库而不是用C ++编写它然后将它包装在C中有什么优点和缺点?

我唯一能想到的就是如果库是用C ++编写的,那么C程序可能需要编译一个C ++编译器,不过我可能不会就此

可能还有一些功能或事物无法包装。

我主要是要求经验,知道在做这个项目时可能会遇到什么。

1 个答案:

答案 0 :(得分:1)

用C语言写,用C ++包装:

优点

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

缺点

  • 可能会陷入一个C ++包装器,这个包装器太C ++ - ish(例如,模板太多)可能很难用另一种语言包装
  • 只有少数语言支持直接连接C ++,尤其是整个C ++。因此,您几乎需要为其他语言编写包装器。

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

优点

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

  • 实际上,如果你遵循一些约定(" ABI"),大多数语言提供了一种调用C DLL / .so而无需任何包装的方法。它在很大程度上是丑陋的,但适用于更简单的接口,原型等。

Disadvatages

  • 与C的接口并不像馅饼那么简单,所以如果你不小心可能会遇到麻烦。例如,在Windows上,要从DLL导出函数,您必须将其标记为“#34;导出"”,它只有一个"事实上的"标准的做事方式。还有struct alignment,enum size(s)和其他问题。

  • 从C接口C ++比反之亦然。你必须确保你的例外不会从C ++传播,正确地#34;翻译" C ++模板(记住std :: string是一个模板),接口中的各种继承习语(接口,混合,"常规"多重继承......)......

我的推荐

我已经完成了两项工作,我的经验表明你应该用最适合你手头任务的语言编写模块。当你完成后,与另一个接口然后包装到其他所有部分。实际上,没有人阻止你从一种语言(比如Ruby)包装C接口和从另一种语言包装c ++(比如Python,使用Cython)。

C和C ++之间的接口比将它们与(几乎所有)其他语言连接起来更容易,因此在决定主要开发语言时不应该是非常重要的影响。