golang可以调用C++的动态链接库么

有一个C++的.so动态链接库和相关的.h文件,可以用golang调用么?


什么库比较好?会有哪些坑?

已邀请:

dada

赞同来自: astaxie itfanr odone philc veni

go调用c/c++的库得用cgo机制,用cgo机制的时候首先先得掌握c/c++的常用编译参数,比如-L、-l、-I这些,遇到错误时候要能判断是编译器报错还是链接器报错,这个基本功非常重要。


其次是掌握cgo的基本用法,比如指针类型怎么传递,字符串类型怎么传递,什么时候该释放字符串内存。


更高级的知识是设置go的回调函数给c/c++,以上这些请仔细阅读文档。


然后实践上要规避各种坑,比如cgo调用的开销,如果你是对c/c++的库做1:1封装,并且在go这边高频次调用,那开销会很大,有时候需要把部分业务逻辑用c/c++合并实现,做成1:N封装,有点像小消息大计算的概念,这样可以简化调用又可以降低开销。


c++的库得自己做一层c来包裹,这里涉及到c++包裹成c的知识,不属于cgo支持,如果之前没做过,需要补充知识。

astaxie - 创造、获取、分享、传播和应用Go

赞同来自: freedkr itfanr philc

William Kennedy之前写过一篇很不错的文章,详细的介绍了如何调用动态库,而且Go1.2版本开始CGO也已经支持C++了。请参考:


https://www.goinggo.net/2013/08/using-c-dynamic-libraries-in-go-programs.html

proofreading - JcJc错别字在线检查工具作者 GoDeCms.com。

赞同来自: itfanr dada

我目前在用 Golang 调用动态链接库 做 CRF 的中文分词识别, 效果很好。


没有使用 SWIG , 直接 用 c 包装了 c++ 的接口。


http://www.GoDeCms.com 错别字在线检查 工具。

Lampo - 高级 Linux 服务器开发群:59151639

赞同来自: itfanr

一般不倾向于直接调用C++的API,我选择的做法是C++导出C的接口, 然后给Go使用。不过这样的场景少的不能再少了

andylau004

赞同来自:

可以调用。。只不过输入被调用接口参数都要做个转换。

要回复问题请先登录注册