golang 调用一个c的so库, 函数RegisterCan
c的回调函数结构如下
typedef void (*CanCallBack)(int canChannel, char * canFrame, int canDataLen,unsigned long long canTime);
int RegisterCan(CanCallBack event);
要用go的实现CanCallBack回调函数的方法
网上找到相关cgo的说明,不是很懂,还望好心人给与提示
golang 调用一个c的so库, 函数RegisterCan
c的回调函数结构如下
typedef void (*CanCallBack)(int canChannel, char * canFrame, int canDataLen,unsigned long long canTime);
int RegisterCan(CanCallBack event);
要用go的实现CanCallBack回调函数的方法
网上找到相关cgo的说明,不是很懂,还望好心人给与提示
说白了,题主需求的场景就是:
go语言侧代码调用第三方的C语言库函数,但是库函数要求传入一个函数指针作为回调,然后题主想用cgo实现这个回调
golang官方关于cgo的wiki页有详细的关于题主询问场景下的解决方法介绍。
主要是要做几件事情:
用cgo实现这个回调函数的本体。比如实现一个类似下面这样的cgo函数,并将其导出
func CanCallBack(canChannel int, canFrame C.String, canDataLen int,
canTime uint64) {
//...函数具体实现
}
以上伪代码是随手写的,主要是参数类型不知道是否合适,特别是那个char 的参数需要根据实际情况来决定在cgo中定义成什么。*
在注释部分用C语言语法实现一个gateway function(gateway function的介绍可参见上文给出的链接,gateway function的签名必须和函数指针一致)。在这个gateway function中通过上述回调函数的导出签名来调用上述回调函数
在你想调用第三方库函数代码的cgo代码中调用这个第三方函数,传参时把上述gateway function的函数名传入
总得来说就是以上三件事,但是具体写代码时还有一些细节需要注意的,我之前写过一篇博客有提到这些注意点,感兴趣的话,题主可以参考一下:
我写的这篇博客讨论的场景和题主期待的场景略有不同,望注意. 不过这里面存在的坑是共通的,比如说必须定义为main包之类的
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
感谢各位的支持,已经找到解决办法
3个文件, can.go , load_so.c , load_so.h
can.go
load_so.c
load_so.h