问题标签 [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 投票
2 回答
1250 浏览

go - 正确的 Go 类型传递给 C 函数?

我正在将我用 C 编写的一些服务器代码移植到 Go 中,它使用了一个我真的不想重写的加密库。相反,我正在尝试使用 Cgo 编写一个包装器,以便我的其余代码可以更轻松地调用它。这是 lib 标头的一部分:

这是我试图开始工作的概念验证片段:

我在标题中定义了一个测试函数 ( int test() { return 1; }),从我的代码 (via) 调用它也没有问题,C.test()也没有引用任何 #defined'd 常量 ( C.CRYPT_BBCFG),但是当我尝试运行go install goserv时出现以下错误:

在这一点上,我假设我只是没有使用正确的参数调用函数。我的印象是 cdata 是 type *C.struct_CRYPT_SETUP, key 应该是*byte(尽管没有 & 也不能工作)和 C.CRYPT_BLUEBURST 类型......东西。尝试C.uchar(CRYPT_BLURBURST)也不会改变任何事情。

关于编译这段代码有什么建议吗?

编辑:忘记我的平台,我正在运行 Mac OS X 10.10

Edit2(已解决):Jsor 关于使用 unsafe.Pointer 和 key 的第一个元素的地址的观点有所帮助,但我还必须将我的 C 源文件移动到与我的 Go 文件相同的目录中。使用 C.struct_CRYPT_DATA 而不是 C.CRYPT_DATA 会导致另一种类型错误,所以如果其他人遇到这样的错误:

然后删除 struct_ 前缀(尽管 cgo 文档说这是直接引用 C 结构类型的方法)

0 投票
1 回答
215 浏览

pointers - cgo pointer value changed

I made bindings to a C api (bullet physics engine) using cgo, some functions make use of data pointers. The idea is that I can attach a pointer to an object and retrieve it later when the physics engine invokes a callback. My problem is that when i get the value back, it change and I didn't do it. It seems that no source code is explicitelly changing the value.

CollisionObject: source, header, The go codes that interracts with that class

heres how i send the values, the reconversion to *int and int is fine, the correct numbers are printed:

But when I get it back from a raytest the value changed:

the pointer value itself didnt change, i can look up and see that there was a pointer pointing to this location, but the value its pointing at is different.

Now i'm wondering if maybe go didn't clean the value (garbage collected) since it wouldn't be used anymore and replaced this memory location with something else.

example output (with junk values removed):

ANY pointer (hehe) is appreciated :)

0 投票
0 回答
299 浏览

go - 如何告诉 cgo 标记一个 [] 字节以进行垃圾收集?

我从 Go 调用以下 C 函数:

我的 Go 代码如下所示:

我应该如何修改MyRead(或相应的 C 代码)以在从返回之前释放分配的缓冲区MyRead

或者,我可以在 C 中重复使用单个缓冲区,从而完全避免分配,并在返回[]byte后创建数据的 Go 副本吗?C.my_read(…)如果是这样,我可以放入一个互斥锁MyRead以确保对 的顺序调用C.my_read(…),但是如何将 C 缓冲区复制到 Go 以便 GC 知道呢?

0 投票
1 回答
2202 浏览

c - Go 与 C 库的包链接

我希望这是一个基本问题。我正在尝试构建一个 Go 包,其中包含用 C 编写的库中的函数。结构基本上如下:

运行go build foo.go失败并出现orig_func. 请注意,标题是mybar.h; 我为此创建了一个原型,orig_func该原型未包含在原始库中。在与 Go 构建链接之前,我是否需要先重新编译库,包括这个头文件?还是我完全误解了其他东西?

0 投票
2 回答
2145 浏览

go - 如何在 Go 中包含来自第三方包的标头?

假设我的包工作区有github.com/yada/yada第三方包。在这个包里面有一个yoda.go.h我想重用的标题(不确定这是否是一个好主意,但这是一个新问题)。如何将依赖包中的标头导入我自己的包中?

除了是一个好主意之外,我仍然想知道它是否可能。

PS:如果你认为这真的是一个坏主意,我应该怎么做呢?

0 投票
2 回答
3220 浏览

go - 如何将 [1024]C.char 转换为 [1024]byte

如何转换此 C(数组)类型:

到这个 Go (array) 类型:

? 尝试进行接口转换会给我这个错误:

0 投票
0 回答
1654 浏览

windows - 有没有办法在 Windows 上使用 cgo 检测 Go 程序的内存泄漏

我正在使用 cgo 链接到 C 库或在我的 Go 项目中使用 C 代码,我想知道是否有一种方法可以检测 Windows 上的内存泄漏。

0 投票
1 回答
2255 浏览

windows - Go 异常“信号在 cgo 执行期间到达”

在什么情况下调用dll时出现“信号在 cgo 执行期间到达”之类的恐慌?

要调用的代码是 - 基于go 分发zsyscall_windows.go中的示例:src

现在,当我打电话时,swe_julday一切似乎都很好;虽然不是,但它给出了错误的答案。当swe_jdut1_to_utc被调用时,我得到:

环境:

而且我不知道是否gcc真的需要调用 dll,但我已经以任何方式安装了它,因为错误是关于cgo. 所有命令都在路径中。使用管理权限编译时出现同样的错误。

被调用的C函数是:

在该 dll 中导入和C#调用此函数的函数(& 有效)是:

0 投票
4 回答
7349 浏览

linux - Golang - 不使用 cgo 时不允许使用 C 源文件

尝试go build在我的 src 目录中运行时,出现此错误:

导入运行时:不使用 cgo 时不允许 C 源文件:atomic_amd64x.c defs.c float.c heapdump.c lfstack.c malloc.c mcache.c mcentral.c mem_linux.c mfixalloc.c mgc0.c mheap.c msize .c os_linux.c panic.c parfor.c proc.c runtime.c signal.c signal_amd64x.c signal_unix.c stack.c string.c sys_x86.c vdso_linux_amd64.c

当我第一次开始学习 Go 时,我在sudo apt-get install golang安装了 1.2 版的 Ubuntu 笔记本电脑(14.04 LTS,64 位)上运行。运行良好,我能够构建、安装和运行应用程序。然后我运行 autoremove 以摆脱它,然后从 golang 网站安装 1,4。

这是怎么回事,我该如何解决?谷歌搜索错误表明它与以前安装的 go 版本有关,但我认为 autoremove 会清理它和任何依赖项(似乎是这样,因为我确保在安装之前在任何地方都找不到 golang来源。

有什么线索吗?

0 投票
0 回答
189 浏览

apache - golang 类型转换循环 - apache 模块

我正在尝试为 Apache 模块系统构建一个 Go 接口。即我希望能够从我的 Apache 模块调用 Go 函数。这是我的 Go 文件:

当我构建它(go build mod_frugal.go)时,我收到此错误:

第 8 行是函数“handler”开始的行。有什么建议么?

或者,当我使用 cgo ( ) 构建时,go tool cgo mod_frugal.go它根本看不到我的包含指令:

当我添加“C”时。为两个 apache 调用添加前缀:

我收到一个新错误:

也许我需要链接 libhttpd?我只是在互联网上找不到任何关于链接到 apache2 的构建,包括 libhttpd 等。

编辑:

随时关注这里的对话: