go调用c/c++库函数

需求:

1.通过go调用c++的sdk,其中有普通函数接口,也有需要传递回调函数的接口

2.支持windows,linux平台

3.代码尽可能通用

调研:

根据查询显示,go调用c/c++一般通过cgo ; cgo可以在go中编写c语言程序,并和go编译???,通过cgo可以实现go和c之间的互相调用;cgo也可以引用头文件,静动态库;

在go中调用c/c++动态库,还有另外一种方式,系统调用syscall;windows上进行了验证;linux上预测只需要.dll库换成对应的.so库???

在syscall的使用中,涉及到数据类型的转换,syscall的参数和返回值都是uintptr;整形;可以和指针进行转换,对于参数为指针的c函数,即为将指针指向的内存地址传给C??? c函数返回的字符串char*,对go来说就是一个uintptr,可以转成byte数组指针,但是没有长度是不好取出来的;可以直接转换成c的char* ;

sid,_,_:=xxx.call()
C.GoString((*C.char)(unsafe.Pointer(sid)))

对于回调函数,go是没有函数指针的,需要用cgo包一层gateway function,在这个c的函数中调用go export的函数,将这个c的地址作为回调函数的指针,参考https://github.com/golang/go/wiki/cgo#function-pointer-callbacks,注意文中最后说的export函数所在文件不可再前置写c的函数,否则会报multi define。。

回调函数,c桥接函数调go的函数,这个go的函数不支持结构体实现函数,因为c中不支持go的struct,似乎是go的结构体对齐方式和c不一样???

cgo官方介绍https://github.com/golang/go/wiki/cgo#function-pointer-callbacks

相似需求的论坛问答https://segmentfault.com/q/1010000011993948

相似需求的博客https://blog.csdn.net/tusong86/article/details/107697905?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

相似需求的博客https://blog.csdn.net/dong_beijing/article/details/79721222

cgo的详细介绍https://books.studygolang.com/advanced-go-programming-book/ch2-cgo/readme.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值