问题标签 [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.
types - Golang:使用 CGo 将 C 字段导出为外部可见
背景:我正在尝试制作一个包,该包基本上提供围绕我正在使用的 C 库的瘦 Go 包装器。该包故意非常原始,因为其他几个包依赖于 C 库的低级功能,我不想复制粘贴一堆 Go 包装器代码。
假设我有一个看起来像这样的 C 结构:
在 CGo 中,我包装 C-struct 并创建新方法,如下所示:
问题是在包之外,我无法访问 C-struct 中的字段
有什么简单的方法可以解决这个问题(除了为每个字段创建访问器方法)?
c - cgo - 如何将字符串转换为 C 固定字符数组
我正在尝试在我的 Go 代码中实例化一个 C 结构。结构是这样定义的(在我无法修改的外部库中):
在进行中,我这样做了:
但它不能编译,因为:
不能在字段值中使用 cStr(类型 *C.char)作为类型 [256]C.char
我试过强制 ([256]C.char)(cStr) 但它显然也不起作用。
有没有办法实现我想要做的事情?
c - 是否可以编写 C 函数来修改 Go 代码中定义的类型的结构?
这是对这个问题的跟进。我在那里做了一个可能不正确的假设,这就是我明确询问它的原因。因为我忘了问这是否真的可行,所以我已经提交了issue #8114。
使用 cgo,可以让 Go 代码对 C 类型进行操作,如下所示:
反过来可能吗?即编写对 go 类型进行操作的 C 函数?上面链接的问题概述了这一点的具体点;我想编组无法从 Go 代码访问的 C 结构,因为它们使用联合或位域,或者因为它们的对齐方式使它们与 Go 代码不兼容。
c - 从 Go 调用 setns 为 mnt 命名空间返回 EINVAL
C 代码工作正常并正确进入命名空间,但 Go 代码似乎总是从setns
调用中返回 EINVAL 以进入mnt
命名空间。我.so
在 Go 上尝试了许多排列(包括带有 cgo 和 external 的嵌入式 C 代码)1.2
,1.3
以及当前的提示。
单步执行代码gdb
表明两个序列都setns
以libc
完全相同的方式调用(或者在我看来)。
我已经将似乎是问题的问题归结为下面的代码。我究竟做错了什么?
设置
我有一个用于启动快速busybox容器的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>
会产生:
c - 从 Go 代码修改 C void* 字节数组
基本上,我试图用 Go 函数替换 C 程序中的 pread 。我的大部分结构都在工作,但我不知道如何用所需的字节填充缓冲区参数(buf unsafe.Pointer)。
daemon.c 的一部分:
在 Golang 文件中:
另一个 Golang 文件:
有什么建议么?我什么都没试过,我完全没有想法。
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
cgo - 使用 cgo 时无法导入更多库
我试图用 C 重写一些 Go 代码,主要是作为一种学习经验,但是我遇到了一个问题,我在其他地方找不到答案。
我正在尝试运行以下代码:
如果我注释掉不安全的导入,它就可以正常工作,但是当我添加它时,我会在 go install/test 命令中收到以下错误:
37:错误:'ConvertStringToArray' 未声明(在此函数中首次使用)
每当我尝试导入任何其他库时,情况也是如此。任何帮助将不胜感激,甚至可以重定向到相关问题(我已经看过但可能错过了一个)。
谢谢,戴夫
c - 在 Golang 中释放 C 变量?
如果我在 Go 中使用 C 变量,我对需要释放哪些变量感到困惑。
例如,如果我这样做:
现在是否分配了内存,直到我调用C.free(unsafe.Pointer(s))
,或者当函数结束时可以被 Go 垃圾收集?
还是只有从导入的 C 代码创建的变量需要释放,而这些从 Go 代码创建的 C 变量将被垃圾回收?
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 语句之间添加空格?
如果我再次看到这种错误,如何最好地调试它?