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

types - Golang:使用 CGo 将 C 字段导出为外部可见

背景:我正在尝试制作一个包,该包基本上提供围绕我正在使用的 C 库的瘦 Go 包装器。该包故意非常原始,因为其他几个包依赖于 C 库的低级功能,我不想复制粘贴一堆 Go 包装器代码。

假设我有一个看起来像这样的 C 结构:

在 CGo 中,我包装 C-struct 并创建新方法,如下所示:

问题是在包之外,我无法访问 C-struct 中的字段

有什么简单的方法可以解决这个问题(除了为每个字段创建访问器方法)?

0 投票
2 回答
6661 浏览

c - cgo - 如何将字符串转换为 C 固定字符数组

我正在尝试在我的 Go 代码中实例化一个 C 结构。结构是这样定义的(在我无法修改的外部库中):

在进行中,我这样做了:

但它不能编译,因为:

不能在字段值中使用 cStr(类型 *C.char)作为类型 [256]C.char

我试过强制 ([256]C.char)(cStr) 但它显然也不起作用。

有没有办法实现我想要做的事情?

0 投票
2 回答
232 浏览

c - 是否可以编写 C 函数来修改 Go 代码中定义的类型的结构?

这是对这个问题的跟进。我在那里做了一个可能不正确的假设,这就是我明确询问它的原因。因为我忘了问这是否真的可行,所以我已经提交了issue #8114


使用 cgo,可以让 Go 代码对 C 类型进行操作,如下所示:

反过来可能吗?即编写对 go 类型进行操作的 C 函数?上面链接的问题概述了这一点的具体点;我想编组无法从 Go 代码访问的 C 结构,因为它们使用联合或位域,或者因为它们的对齐方式使它们与 Go 代码不兼容。

0 投票
1 回答
2806 浏览

c - 从 Go 调用 setns 为 mnt 命名空间返回 EINVAL

C 代码工作正常并正确进入命名空间,但 Go 代码似乎总是从setns调用中返回 EINVAL 以进入mnt命名空间。我.so在 Go 上尝试了许多排列(包括带有 cgo 和 external 的嵌入式 C 代码)1.21.3以及当前的提示。

单步执行代码gdb表明两个序列都setnslibc完全相同的方式调用(或者在我看来)。

我已经将似乎是问题的问题归结为下面的代码。我究竟做错了什么?

设置

我有一个用于启动快速bu​​sybox容器的shell别名:

运行后,startbb将启动一个容器并输出它的 PID。

lxc-checkconfig输出:

uname -a产生:

工作 C 代码

以下 C 代码可以正常工作:

用 编译后gcc -o checkns checkns.c,输出sudo ./checkns <PID>为:

失败的 Go 代码

相反,下面的 Go 代码(应该是相同的)不能很好地工作:

相反,运行sudo go run main.go <PID>会产生:

0 投票
1 回答
989 浏览

c - 从 Go 代码修改 C void* 字节数组

基本上,我试图用 Go 函数替换 C 程序中的 pread 。我的大部分结构都在工作,但我不知道如何用所需的字节填充缓冲区参数(buf unsafe.Pointer)。

daemon.c 的一部分:

在 Golang 文件中:

另一个 Golang 文件:

有什么建议么?我什么都没试过,我完全没有想法。

0 投票
1 回答
1407 浏览

sqlite - Why do I get "duplicate symbol reference" when including two cgo based libraries?

I'm trying to build (go build) the following:

and I get an error:

duplicate symbol reference: __moddi3 in both github.com/d2g/unqlitego( .text) and github.com/mattn/go-sqlite3(.text)

I'm running go version go1.3.1 windows/386.

Am I doing something wrong? How would you resolve this sort of issue?

Is this OS/Go Version/Architecture specific bug? (I'd appreciate "it works for me" with the output from your go version)

I've put this all in a repo so you should be able to just go get github.com/d2g/issue-duplicate_symbol.

As per comments looks like a Windows 386 issue logged on: https://code.google.com/p/go/issues/detail?id=8702

0 投票
1 回答
28 浏览

cgo - 使用 cgo 时无法导入更多库

我试图用 C 重写一些 Go 代码,主要是作为一种学习经验,但是我遇到了一个问题,我在其他地方找不到答案。

我正在尝试运行以下代码:

如果我注释掉不安全的导入,它就可以正常工作,但是当我添加它时,我会在 go install/test 命令中收到以下错误:

37:错误:'ConvertStringToArray' 未声明(在此函数中首次使用)

每当我尝试导入任何其他库时,情况也是如此。任何帮助将不胜感激,甚至可以重定向到相关问题(我已经看过但可能错过了一个)。

谢谢,戴夫

0 投票
1 回答
3558 浏览

c - 在 Golang 中释放 C 变量?

如果我在 Go 中使用 C 变量,我对需要释放哪些变量感到困惑。

例如,如果我这样做:

现在是否分配了内存,直到我调用C.free(unsafe.Pointer(s)),或者当函数结束时可以被 Go 垃圾收集?

还是只有从导入的 C 代码创建的变量需要释放,而这些从 Go 代码创建的 C 变量将被垃圾回收?

0 投票
2 回答
430 浏览

go - 调用c函数,“import fmt”,“import C”的顺序导致构建错误,为什么?

我有以下简单的测试代码: call_c.go

我使用“ go build call_c.go ”来构建程序并且构建良好。

但是我发现如果我简单地颠倒“import fmt”、“import C”的顺序或者在C /* */块代码和第一个import语句之间添加一个换行符,“go build call_c.go”命令就会返回一个错误:

专家地鼠的问题:

为什么导入的顺序在 go 中很重要?

为什么我不能在 C 块和第一个 import 语句之间添加空格?

如果我再次看到这种错误,如何最好地调试它?

0 投票
2 回答
143 浏览

c - 如何使用 Cgo 访问 MATLAB 数组中的值?

使用 MatLab C API 和 Go 的Cgo 包,我试图在我的 Go 程序的 mat 文件中读取 24x3000000 矩阵。我能够成功读取矩阵的维度,但如何访问每个单元格内的值?(最终目标是将此矩阵作为切片返回给我的 Go 程序。)

作为参考,这里是C 的矩阵库 API