cgo与调用c的回调函数指针

cgo直接调用函数,使用基本数据类型非常简单,包括一些结构体也比较简单,嵌套的稍微复杂些,但也可以,但有的时候,cgo调用c函数,会需要传递一个回调函数的指针,这时候就比较复杂了,要比python的ctypes复杂很多,python可以用winfunc很轻松去创建这样的函数,但是对于 go 这种编译型语言来说,就很麻烦了,实际上是如下操作:

先看官方代码:

这块是头文件的声明

一、构造包装函数(callOnMeGo_cgo),这里通过cgo编写一个自己的c函数,满足要调用库的callback格式就可以。

这里int callOnMeGo(int);的函数声明,可以放到函数体外面去,便于查看。

如果只需要结构体某些字段,可以直接在这里提取后转发过去,省略了Go语言中操作的步骤。 

二、用包装函数调用真正的go函数(callOnMeGo),然后就可以实现回调了

这里主入口,记得声明下包装函数的结构;

问题解决:

1.传参后,回调函数调用没效果:

一般这种都是回调函数的参数类型不对,比如说void *传unsafe.pointer是可以的;但是结构体指针不能传unsafe.pointer,可直接声明C.STRUCTXXX,是指针就传* C.STRUCTXXXX

注意,回调参数有问题, 请看下引用的C或者C++ SDK 自己的日志,go程序是不会有任何反应的。

2.编译报错

编译报错需要检查

①.是否注释内部有嵌套,有的需要删掉或者拿出去

②.头文件的struct是否带 tag 不带tag 需要增加

③. 是否出现了释放不该释放的内容,比如说,回调传过来的结构体,通过var声明后,就进入到了Go的GC范围内,不要去C.free

④.是否有C++的东西,如果有C++的东西需要转换成C语言

⑤.编译的平台需要一致,编译时,需要编译整个package;64位的lib,需要 64 位的cgo编译 

⑥.编译后导入表会对指定函数有强依赖,必须带入依赖库,运行时不像syscall可以懒加载。

⑦.CFLAGS、LDFLAGS的参数是否完整,比如说没有使用-l指定对应的lib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/170983.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解释tqdm模块显示进度条:

1. 在Python中&#xff0c;当你使用tqdm模块&#xff08;一个快速、可扩展的Python进度条库&#xff09;时&#xff0c;你可能会看到类似的输出&#xff1a;[6:20:38<6:34:14, 31.25s/it]。 这个输出提供了关于循环进度的详细信息&#xff1a; 6:20:38: 这是已经过去的时…

五分钟利用Vite创建Vue项目

1.准备工具 Vite是尤雨溪团队开发的&#xff0c;官方称是下一代新型前端构建工具&#xff0c;能够显著提升前端开发体验。 上面称是下一代&#xff0c;当前一代当然是我们熟悉的webpack Vite 优势 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动。轻量快速…

【C++】【Opencv】minMaxLoc()函数详解和示例

minMaxLoc&#xff08;&#xff09;函数 是 OpenCV 库中的一个函数&#xff0c;用于找到一个多维数组中的最小值和最大值&#xff0c;以及它们的位置。这个函数对于处理图像和数组非常有用。本文通过参数和示例详解&#xff0c;帮助大家理解和使用该函数。 参数详解 函数原型…

Flutter有状态组件StatefulWidget生命周期

StatefulWidget是Flutter中的一个有状态的组件&#xff0c;它的生命周期相对复杂一些。下面是StatefulWidget的生命周期方法及其调用顺序&#xff1a; 1. createState(): 当StatefulWidget被插入到Widget树中时&#xff0c;会调用createState()方法来创建与之关联的State对象。…

Redis集群,你真的学会了吗?

目录 1、为什么引入集群 1.1、先来了解集群是什么 1.2、哨兵模式的缺陷 引入集群解决了什么问题 1.3、使用集群&#xff0c;如何存储数据 2、三种主流的分片方式【经典面试题】 2.1、哈希求余算法 2.1.1、哈希求余算法的介绍 2.1.2、哈希求余算法如何扩容 2.2、一致性…

数据分析 - 思考题

上班路上刷到的有趣题

作用域插槽slot-scope

一般用于组件封装&#xff0c;将使用props传入组件的数据再次调出来或者单纯调用组件中的数据。也可用于为组件某个部分自定义样式以及为某次使用组件自定义样式。 直接拿elementui的el-table举例&#xff1a; <template><el-table v-loading"loading&q…

《QT从基础到进阶·十七》QCursor鼠标的不同位置坐标获取

一些常用鼠标图形&#xff1a; 鼠标光标相对于整个电脑屏幕的位置&#xff1a;QCursor::pos() 当前光标相对于当前窗口的位置&#xff1a;this->mapFromGlobal(QCursor::pos()) void MainWindow::mouseReleaseEvent(QMouseEvent* event) {QPoint pos event->pos(); …

设计模式1

![在这里插入图片描述](https://img-blog.csdnimg.cn/c9fbecf1ae89436095885722380ea460.png)一、设计模式分类&#xff1a; 1、创建型模式&#xff1a;创建与使用分离&#xff0c;单例、原型、工厂、抽象、建造者。 2、结构型模式&#xff1a;用于描述如何将对象按某种更大的…

智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理&#xff0c;建设项目与智能生产、科学管理建设项目信息生态系统集成在一起&#xff0c;该数据在虚拟现实环境中&#xff0c;将物联网收集的工程信息用于数据挖掘和分析&#xff0c;提供过程趋势预测和专家计划&#xff0c;实现工程建设的智能化管理&a…

面向切面:AOP

面向切面&#xff1a;AOP 大家好&#xff0c;今天本篇博客我们来了解Spring里边的另一个重要部分&#xff0c;叫做AOP&#xff0c;也就是我们说的面向切面编程。 1、场景模拟 首先第一部分&#xff0c;咱们做一个场景模拟。我们先写一个简单的例子&#xff0c;然后通过例子引…

【Java 进阶篇】JQuery DOM操作:Class属性的舞蹈魔法

在前端的世界中&#xff0c;JQuery如同一位舞者&#xff0c;通过灵活的舞步为我们展示了操纵HTML元素的艺术。而在这场舞蹈的精彩演出中&#xff0c;Class属性的操作是一项极富魅力的技艺。在本篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的Class属性操作&#xff0c;…