问题标签 [cgo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
142 浏览

c - 在 Go cgo 中更改 WebKitWebSettings

我正在使用 go-webkit 并且我有一个 webkitsettings 实例,我该如何更改设置?

我正在尝试做这样的事情

main.go

来自https://github.com/mattn/go-webkit/blob/master/webkit/webkit.go#L370的 go-webkit 片段

}

Webkit API: 1.0 http://webkitgtk.org/reference/webkitgtk/stable/WebKitWebSettings.html

0 投票
1 回答
425 浏览

go - Go 类型转换为 *ptrdiff_t?

在我调用 C 函数的 Go 程序中,我可以成功地intptrdiff_t. (有点令人担忧的是,即使int8Go 类型对于任何现代架构来说都太小了,但也会成功编译。)但是*int*ptrdiff_t产生编译器错误: cannot convert <varname> (type *int) to type *_Ctype_ptrdiff_t. 唯一允许成功编译的类型是int64. 我意识到我可以将我的变量声明为 (*)C.ptrdiff_t 但我想了解相应的 Go 类型以及 Go 编译器在这种情况下的意外行为?

0 投票
2 回答
545 浏览

utf-8 - 在 Go 中使用 C 库时,如何正确地将 UTF-8 编码的字符数组转换为 Go 字符串?

我正在尝试在 Go 中使用 C 库。该C.PrlFoundVmInfo_GetName函数将 UTF-8 编码的字符串写入长度为nBufSize的名称

声明name(和nBufSize )的正确方法是什么?如何将name转换为 Go字符串?上面的代码没有按我的预期工作。它打印:

C API 文档,摘录

PrlFoundVmInfo_GetName - 参数

  • handle - 标识容器的 PHT_FOUND_VM_INFO 类型的句柄。
  • sName - [out] 指向接收名称的缓冲区的指针。传递一个空指针来确定所需的缓冲区大小。
  • pnNameBufLength - [in] 用于接收输出数据的缓冲区大小(以字节为单位)。[out] 如果缓冲区参数包含空指针或指定的缓冲区大小不够大,则需要的缓冲区大小。

完整的文档可在C API 文档 - PrlFoundVmInfo_GetName 获得

0 投票
1 回答
114 浏览

c - 如何提供对我用 cgo 包装的库的访问权限?

我正在尝试为 C 库编写绑定,特别是libnfc。我当前的代码在Github上可用。

libnfc 中的核心结构之一是设备。它由 Go 类型表示Device

libnfc 中所有对 a 进行操作的函数Device都是它的方法。现在,还有其他 C 库(例如 libfreefare),其 API 在nfc_devicees 上运行。为了模块化,我想将我包装的每个库的代码放入它自己的模块中。这导致了问题,即我无法从其他模块中访问私有结构成员。我想到了以下解决方案:

  • 成为d公共成员Device

    这将使nfc_device从其他模块中访问底层变得容易,但它也使得回避类型安全也变得容易。此外,如果 cgo 来自不同的模块,我不知道是否可以识别指向外部类型的指针。最后,如果我更改 Device 类型的结构,我将失去灵活性。

  • 添加访问器func (Device) GetCPtr() unsafe.Pointer

    这解决了上述问题,但引入了一个新问题,即您突然可以访问一个unsafe.Pointer甚至可能无法导入的模块中的一个unsafe

  • 添加访问器func (Device) GetCPtr() uintptr

    这解决了上述问题,因为您必须手动转换结果才能获得正确的指针。

有什么我错过的方法吗?是否有更好、更惯用的方式来提供对底层的访问nfc_device

0 投票
1 回答
660 浏览

c - 将字符串文字传递给 C

我正在玩在 go 中调用 C 代码。但是,当我尝试使用printffrom go 时,我收到有关格式字符串不是字符串文字的警告:

警告:

警告:格式字符串不是字符串文字(可能不安全)[-Wformat-security]

如何将字符串文字传递给 C 函数,例如printf?是否有类似于C.CString()我可以使用的功能,或者它是不可能的,我应该忽略这个警告?

0 投票
4 回答
3416 浏览

go - Golang zmq 绑定,ZMQ4,返回包错误未找到文件 zmq.h

我试图在 Go 应用程序中包含 ZMQ 套接字,但是 zmq4 和 gozmq(Go 的 ZMQ 绑定库)都给我带来了问题。我想了解为什么 zmq4 特别不能在我的系统上导入。

我正在运行 Windows 8 系统,并使用 ZMQ 网站上的 Windows 安装程序 4.0.3 版。我主要关心的是如何设置 zmq4,这是我对 github 库位置的“go get”查询的结果:

克隆 Github 存储库并不能缓解此问题 - 错误保持不变。

我知道这个问题与位于我的 ZMQ 安装的“include”文件夹中的 C 库 zmq.h 有关,但是依赖关系是由路径问题还是外部工具问题引起的对我来说是个谜。

关于 node.js 也出现了类似的错误,这是我看到其他人在节点脚本之外提到的解决方案,但在我的情况下它是不成功的。

到目前为止,我已经在我的 PATH 环境变量中包含了“include”文件夹的路径,并且之前将 zmq.h 放在了 zmq4 顶级文件夹中。我没有太多的武器库来理解这个问题,因为我是 Go 中 C 和 C 导入包的新手

0 投票
1 回答
309 浏览

c - 如何将 Go 绑定建模到使用联合的 C 结构?

我目前正在为libfreefare编写一个Go 包装器。libfreefare 的 API 包含以下函数:

包装这种功能的理想解决方案是什么?如果struct mifare_desfire_file_settings不包含任何联合,我的包装器可能如下所示:

我应该如何进行?

0 投票
1 回答
840 浏览

go - golang cgo:libevent处理程序值在执行期间设置为null

我正在将这个 C API 移植到https://github.com/shammash/vde3中,该库有自己的使用 libevent 的事件循环,我正在使用 CGO。

该库需要以这种方式组成的完整 vde_event_handler

具有一系列指向函数的指针的结构

在执行过程中,该字段设置为 NULL,我不明白为什么,我认为可能是 go 垃圾收集器(出于某种原因)找到参考 dandling 并删除它们,但这不应该是这种情况

这是被指控的功能https://github.com/kurojishi/govde3/blob/master/govde.go#L23

这是一个gdb日志

0 投票
2 回答
5317 浏览

go - 将 C 结构转换为 Go 结构的好方法或推荐方法

我正在使用 cgo 从 Go 开发库绑定。让我考虑如下的 C 结构和 Go 结构。

这是go的结构

为了实现下面的 Go 功能,实现 TranslateCCons2GoCons 的更好方法是什么?

我的第一个答案如下。

有没有更好的方法?

0 投票
1 回答
740 浏览

go - 在 CGO 中正确使用空结构

使用gssapi.h

我试图弄清楚如何正确初始化包含它的变量

但是像gss_import_name这样的函数就像我将空指针传递给它们一样。在 CGO 中正确初始化和使用这些空结构的正确方法是什么?