需求:
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/dong_beijing/article/details/79721222
cgo的详细介绍https://books.studygolang.com/advanced-go-programming-book/ch2-cgo/readme.html