swift - 将巨大的 C++ 库自动包装到 C 以在 Swift/Go 中导入

标签 swift go

假设我有一个巨大的 C++ 库(有大量依赖项,在 GCC 下完整构建需要大约 3 小时)。我想在该库的基础上进行构建,但不想在 C++ 中这样做,而是使用更高效的语言。我如何才能真正桥接或包装那个 extern lib 包,以便我可以用另一种语言访问它并在它之上编程?

考虑的语言:

  • swift

我发现,这两种语言都为 C 库和代码提供了自动桥接或包装(我实际上不知道包装/桥接之间有什么区别)。所以,如果我有一些 c 代码,我可以将它放在同一个 Swift 或 Go 项目中,并可以在我的项目中通过简单的导入来使用它。

这在两种语言中都不适用于 C++ 代码。所以我用谷歌搜索了如何将 C++ 库转换为 C 代码或生成自动包装器。我发现了以下内容:

  1. swig.org - C++ 库的自动包装器
  2. Comeau C++ 编译器 - 自动将 C++ 转换为 C 代码
  3. LLVM - 应该能够接受 any 输入并将其转换为 LLVM 能够处理的 any 输出。

问题:

  1. 它是否甚至在可用/现实/可管理的领域中构建 在 Swift/Go 等其他语言中如此庞大的库之上,如果 使用自动换行还是自动桥接?
  2. 列出的 3 个库/程序/框架中哪些最适合 C++ -> C 的进程(因为 Swift 和 Go 都提供 C auto 包装)。
  3. 有没有比我目前考虑的更好的选择?
  4. “坚持使用 C++”会不会更好,因为使用任何其他工具来执行包装/桥接过程会非常麻烦 努力平衡使用更高效的语言的好处 喜欢 Swift/Go?

谢谢:)

免责声明:也可以在 C 中手动包装 C++ 库,但对于如此庞大的库来说,这将花费大量工作。

最佳答案

Q1:现实吗?

不现实,因为任何大型复杂的 C++ 互操作都会变得过于复杂。自动工具很可能会失败,而手动工作太难了。

Q2:什么是最好的?

我不知道,鉴于 A1,这似乎无关紧要。

Q3:替代方案? Q4:只有 C++ 才是最好的选择吗?

如果您想利用其他语言的现有 C++ 代码,而不管涉及哪种语言,复杂场景中的最佳选择是使用混合方法。

由于非标准 C++ 命名约定,大多数语言都提供与 C 而不是 C++ 的互操作。换句话说,几乎每种语言都提供对普通 C 函数的访问,但 C++ 通常不受支持。

由于您的库很复杂,最好的解决方案是基于“Facade”模式。创建一个新的 C 库并实现利用 C++ 库的应用程序特定逻辑。尝试将此库设计为尽可能薄。目标不是编写所有业务逻辑,而是提供保存 C++ 对象并调用 C++ 函数的 C 函数。然后,GO 级语言代码将调用此库以使用下面的 C++ 库。这种方法不同于 Q1 方法。在 Q1 中,您尝试对每个 C++ 函数或对象的方法进行一次互操作调用。在 Facade 中,您尝试实现应用程序独有的 C++ 使用场景。

使用 Facade,您可以减少互操作工作的范围,因为您针对的是应用场景。同时,您可以在 GO 语言级别减轻 C++ 的复杂性。

例如,您需要使用 C++ 库读取温度传感器。

在 C++ 中你必须这样做:

  1. 打开文件
  2. 读取流,直到找到 SLIP 终止符
  3. 读取一条“记录”
  4. 关闭文件

使用外观,您可以创建一个名为“readTemperature(deviceFileName)”的函数,并且该 C 函数一次执行 4 次调用。

这是一个假例子,只是为了说明这一点。

使用外观你可能想要隐藏原始 C++ 对象,此时它变成了一个小层。这里的目标是保持专注并平衡您的应用程序需求与泛化以支持您的应用程序。

有趣的是,Facade 方法是一种提高互操作性能的方法。由于需要从语言运行时环境编码并对其进行保护,几乎每种语言的互操作都比正常操作更昂贵。许多互操作调用会减慢应用程序的速度(我们在这里谈论的是数百万)。例如,将 10 个互操作调用合并为 1 个可以提高性能,因为减少了 itnerop 操作的数量。

关于swift - 将巨大的 C++ 库自动包装到 C 以在 Swift/Go 中导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39104754/

相关文章:

swift - 如何使用 eureka lib 在 View 中调整表单 View Controller ?

go - 不明显的死锁情况

go - 使用 Iris-go 处理 body 支柱

go - 等待缓冲 channel 满

linux - 在 darwin for linux 上交叉编译 CGO 应用程序

ios - Swift 3 - 如何使用 Alamofire 和 SwiftyJSON 获取 JSON 对象

ios - 裁剪 UIImage 没有产生预期的裁剪 - swift ?

ios - 如何更改添加到 Storyboard 中的 UIView 的中心?

ios - 如何删除应用程序沙箱中的文件?

google-app-engine - Google App Engine 自定义域 - Go 中的路由