问题标签 [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 回答
3680 浏览

go - 将现有的 C 代码集成到 Go。将无符号字符指针结果转换为 []byte

这是一个简单的例子:

结果我得到了这样的东西

指针data,第一个字符data和大小。但是我怎样才能得到实际data值,最好是作为 []byte 类型在 go 代码中使用它?
换句话说 - 如何转换unsigned char *[]byte

0 投票
1 回答
502 浏览

go - GoLang / CGO:从 Go 调用 Mach API host_statistics() 时出现问题

我使用以下 C 代码片段来获取 OS X 上的 CPU 负载:

在阅读了 cgo 教程后,我尝试将这段代码移植到 Go。生成的代码如下所示:

但是,当我尝试构建代码时,我最终得到以下错误消息

我不明白为什么 cgo 抱怨这种类型。host_statistics() 的签名在 mach 标头中定义为:

0 投票
1 回答
978 浏览

c - C 常量上的 Cgo 链接器错误

我正在使用 cgo 包装一个 C 库并遇到了一组奇怪的链接器错误。我将问题归结为以下几点:

文件 header.h 包含

并且 test.go 包含

运行时go run test.go出现以下错误:

我对此有两个问题:

  1. 为什么链接器与预定义的常量有任何关系?
  2. 为什么CONSTANT1, CONSTANT3,CONSTANT4显示为未定义,但不是CONSTANT2

提前致谢。

*编辑:定义为其他值(例如整数)的常量可以正常工作。

*Edit2:使用 go 版本 go1.1.2 linux/amd64

*Edit3:失败的完整示例:

我正在使用 C OpenLDAP 库并希望使用该LDAP_SASL_SIMPLE常量。它被定义ldap.h

LDAP_SASL_NULL常数给出了相同的错误。

一个最小的演示 go 程序:

0 投票
2 回答
5038 浏览

go - go build 在编译 cgo 包时找不到我的 C 标准库

我正在尝试在树莓派中编译一个 go 项目。

该项目有 5 个文件,两个小.c文件及其对应文件(其中一个文件是我的代码 - 它调用.h另一个,它是一个 base64 库)和一个使用..go.ccgo

当我只在树莓派上编译我的 C 代码(及其调用和所有内容)时gcc,它在没有任何配置的情况下运行良好。

x86当我在我的Linux Ubuntu 机器上编译整个 go 项目时go build,它也做得很好。

但是当我尝试go build在树莓派中编译 go 项目时,它没有得到我的 C 库:

(如果我把它放在问题发生<stdlib.h>之前<math.h>,那么问题不在于没有 math.h,我认为)我试图:

  • 添加// #cgo CFLAGS: -I/usr/include.go文件中
  • 添加// #cgo LDFLAGS: -I/usr/include(我无法发现这些标志的正确用法是什么)
  • 采用go build -ldflags '-I/usr/include'

我不明白为什么 go 试图用-I /usr/lib/go/pkg/linux_arm. 真的不要。有人帮忙。

编辑:关于项目结构的澄清说明:

它有 5 个文件,2 个 C(及其对应的 H):

base64.c

项目.c

和 1 去:

我应该在哪里,什么以及如何改变这个声明才能让这个东西起作用?为什么它可以在我的 x86 linux 上运行?

0 投票
1 回答
202 浏览

go - 是否可以将 go 包制作为 .so 或 .a 文件?

最近我花了一些时间在 cgo 以及如何在 go 中编写 C 代码。使用#cgo 指令加载.so 文件似乎很容易。但是,有什么方法可以以相反的方式做到这一点?也就是说,我们可以将 go 包构建到 .so 或 .a 文件中,以便 c/c++ 项目可以直接使用它吗?

0 投票
3 回答
11096 浏览

go - 将结构和结构数组从 Go 传递给 C 函数

卡住了这个问题。只能获得传递结构的第一个成员......我做错了什么?将结构从 Go 传递到 C 的正确方法是什么?

这是我如何不起作用的示例:

0 投票
1 回答
932 浏览

c - mmap 缓冲区到文件句柄

我需要“伪造”一个文件描述符(支持fstat),我就是这样做的。

您会看到写入文件句柄的位置被注释掉了。

如果我不将缓冲区写入分配的区域,则它是空的。我希望mmap结合MAP_FIXED使用提供的缓冲区的地址,从而将内容映射到该区域。

我猜write调用副本,从而使内存使用量加倍。我真的必须write吗?

0 投票
1 回答
763 浏览

go - 在 Go 中使用可变参数 C 函数

我用shm_opencgo。shm_open在 Linux 上用 3 个参数定义

而在 OSX (Darwin) 上,第 3 模式标志是可选的。

当尝试在 OSX 上传递模式时,这会导致 CGO 出现问题。它抱怨我传递了 3 个参数,而预期只有 2 个。

我该如何解决这个问题?

0 投票
1 回答
1334 浏览

garbage-collection - 有没有一种安全的方法可以使用 CGo 从 C 代码中保持对 Go 变量的引用?

当使用 CGo 将 C 代码与 Go 接口时,如果我在 C 端保留对 Go 变量的引用,我是否会冒该对象被垃圾收集器释放的风险,或者 GC 会看到由管理的变量中的指针C面?

为了说明我在问什么,请考虑以下示例程序:

去代码:

C代码:

我是否冒着在and调用foo->ch之间被垃圾收集器释放的风险?如果是这样,有没有办法从 C 端固定 Go 变量,以防止它在我持有对它的引用时被释放?foo_newfoo_send

0 投票
1 回答
3204 浏览

go - golang: cgo extern is not working

I am trying to run cgo for golang with following example (given at go-wiki -> Global Functions):

foo.go file:

foo.c file:

While running this example, I am getting following error:

I am not able to trace this down. Why ACFunction is undefined? or Am I missing something?

go version: go version go1.1.2 linux/386