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

Shi*_*yin 9 go swift

假设我有一个巨大的C++库(有大量的依赖项,在GCC下完整构建需要大约3小时).我想在lib上构建,但不想在C++中这样做,而是在更高效的语言中.我怎么能实际桥接或包装extern lib包,以便我可以用另一种语言和程序访问它?

考虑的语言:

  • 迅速

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

但是,这在C++代码的两种语言中都不起作用.所以我用谷歌搜索了如何将C++库转换为C代码或生成自动包装器.我找到了以下内容:

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

题:

  1. 如果使用自动包装或自动桥接,它是否甚至在可用/现实/可管理的领域中构建在Swift/Go等其他语言中如此庞大的lib之上?
  2. 列出的3个库/程序/框架中哪些最适合C++的过程 - > C(因为Swift和Go都提供C自动换行).
  3. 有没有比我到目前为止考虑的更好的选择?
  4. 是否更好地"坚持使用C++",因为使用任何其他工具来进行包装/桥接过程将是非常重要的工作,以平衡使用像Swift/Go这样更高效的语言的好处?

谢谢:)

免责声明:还有可能在C语言中手动包装C++库,但这对于如此庞大的lib来说需要付出无法忍受的大量工作.

Ser*_*i G 2

Q1:现实吗?

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

Q2:什么是最好的?

我不知道,鉴于A1,这似乎并不重要。

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

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

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

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

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

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

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

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

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

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

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

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