用 go + swig 替换 c++

Posted

技术标签:

【中文标题】用 go + swig 替换 c++【英文标题】:replace c++ with go + swig 【发布时间】:2012-01-09 15:12:48 【问题描述】:

我最近问了这个问题https://softwareengineering.stackexchange.com/questions/129076/go-instead-of-c-c-with-cgo 并得到了一些非常有趣的意见。但是我的问题有一个错误:我认为 cgo 也可以用于访问 c++ 代码,但这是不可能的。相反,您需要使用 SWIG。

go faq 说“cgo 程序提供了一种‘外来函数接口’的机制,以允许从 Go 代码安全调用 C 库。SWIG 将此功能扩展到 C++ 库。”

我的问题: 是否可以使用 SWIG + Go 访问高级 c++ 框架(例如 QT)并提高工作效率?我想使用 Go 作为“脚本语言”来利用 c++ 库。

你有使用 go 和 swig 的经验吗?有没有我必须注意的陷阱?

更新/回答:我也通过 IRC 提出过这个问题,我认为问题已经解决了:

SWIG 是一种相当简洁的方式来连接来自其他语言的 c++ 代码。遗憾的是,将 c++ 的类型与 go 之类的类型匹配可能非常复杂,并且在大多数情况下,您必须自己指定映射。这意味着 SWIG 是利用现有代码库重用已编写算法的好方法。然而,映射像 Qt 这样的库会花费你很长时间。请注意,这肯定是可能的,但您不想这样做。

那些来这里使用 go 进行 gui 编程的人可能想尝试 go-gtk 或 wxWidgets 的 go 版本。

【问题讨论】:

这属于***。投票关闭/移动。 这很有趣:首先我在 *** 上询问了programmers.stackexchange.com/questions/129076/…,然后被转移到了programmers.stackexchange。现在更新的问题从程序员那里移回了这里。 我认为有人想将这个问题迁移给程序员是很荒谬的。在我看来,这正是 *** 所要解决的问题。我错了吗? 不,你是对的。这就是我在这里问的原因;) @lhk:您的另一个问题非常笼统,询问了两种方法的优缺点(或者看起来如此)。这属于程序员。这是一个实际的编程问题,属于这里。 【参考方案1】:

有可能吗?是的。

能否在相当短的时间内完成?没有。

如果您回过头来看看其他采用大型框架并尝试在其上放置抽象层的项目,您会发现大多数都是“不完整的”。您可能会有一个相当好的开始并获得一些初始包装器,但通常即使有很多底层代码需要包装,即使是解决简单案例的工作也需要时间,即使使用自动化工具(这有帮助,但从来没有一个完整的解决方案)。然后......你会得到令人讨厌的剩余 10%,这将带你永远(好吧,至少真的很长一段时间)。然后首先考虑一下它是如何成为一个不断变化的目标的。例如,Qt 即将发布下一次重大改写。

通常,坚持使用框架设计的框架语言是最安全的。尽管许多项目本身都有语言扩展。例如,对于 Qt,您应该查看 QML,它提供(以及许多其他东西)到 Qt 的 javascript 绑定。有点。但它可能满足您的“脚本”要求。

【讨论】:

+1 并被接受为答案。前两句话可能是 *** 上一半问题的好答案;)【参考方案2】:

关于此问题的相关更新:现在可以使用带有this CL 的 cgo 与 C++ 交互,该 this CL 已合并为 Go 1.2。但是,它仅限于类 C 函数调用,并且不支持类、方法和 C++ 好东西(但我希望如此)。

【讨论】:

以上是关于用 go + swig 替换 c++的主要内容,如果未能解决你的问题,请参考以下文章

swig官方go Examples 源码勘误

Go中的OpenCV(或类似库)[关闭]

用 Go 编写的音频库?

用 C++ 样式注释替换 C 样式注释

用预处理器替换 C++ 类/静态方法?

C++ 模板继承。子类应该用固定类型替换基类中的类型