2 回答
TA贡献1845条经验 获得超8个赞
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++ 中,你必须这样做:
打开文件
读取流,直到找到 SLIP 终止符
读一个“记录”
关闭文件
使用外观,您可以创建一个名为“readTemperature(deviceFileName)”的函数,并且该 C 函数一次执行 4 个调用。
这是一个假的例子,只是为了说明这一点。
使用外观你可能想要隐藏原始 C++ 对象,此时它变成了一个小层。这里的目标是保持专注并平衡您的应用程序需求与泛化以支持您的应用程序。
有趣的是,Facade 方法是提高互操作性能的一种方法。由于需要从语言运行时环境编组并对其进行保护,几乎每种语言的互操作都比正常操作更昂贵。许多互操作调用会减慢应用程序的速度(我们在这里谈论的是数百万)。例如,将 10 个互操作调用合并为 1 个可以提高性能,因为减少了 itnerop 操作的数量。
TA贡献1829条经验 获得超7个赞
我使用一个相对简单的过程成功地在 Swift 中包装了一个大型(尽管可能不是“巨大”)C++ 库(数百个头文件)。您直接将项目链接到库。您唯一需要包装的是您编写的(将在 Swift 中调用)实际使用库(在 C++ 包装文件中)的任何新函数。冗长的东西可以留在包装文件中,大多数情况下不做任何修改。有一个简单的小教程对我有帮助:https ://www.swiftprogrammer.info/swift_call_cpp.html
(仅供参考,他省略了一个步骤:在 Build Settings => Search Paths => Library Search Paths(调试和发布)中设置库搜索路径)
- 2 回答
- 0 关注
- 197 浏览
添加回答
举报