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

c++ - 在带有 Visual Studio 的 Windows 上使用 swig -go

我想在 Windows 上使用 golang call c++ dll with swig。(gc编译,在Linux上是成功的。)但是有一些问题。这是示例。

现在,我使用这个 cmd 来生成包装文件:

然后在VS中创建一个空的dll项目,将sample.h也添加到Header Files,将sample.cpp和sample_wrap.cxx添加到Source Files,将sample.i添加到项目中。

构建解决方案,生成 sample.dll

如下使用 cmd 生成 sample.a:

接下来,安装 sample.a(以避免一些问题),然后运行 ​​test.go:

问题就在这里,当我运行 test.go 时,得到了错误:

如何解决问题(dll 和 test.go 在同一目录中)?谢谢!如果您需要我错过的额外信息,请询问。

亚历克斯

0 投票
2 回答
4657 浏览

go - Golang (cgo) - 任意 void* 接口

我正在包装一个 C 库,该库具有一个带有 void* 数据字段的结构,可用于任意保存数据。将其包装在惯用的 Go 中的最佳方式(如果可能的话)是什么?

结构很简单:

我希望做类似的事情:

这是行不通的,而且显然是错误的方法。

我已经使用 []byte 源成功地设置了一个带有长度字段的 void* 数据,但是这个无长度接口让我无法理解。

0 投票
1 回答
2375 浏览

go - cgo 和 pkg-config

我想用 cgo 运行 GraphicsMagick。

然后我运行“安装”,它说:

但我在 shell 中运行“pkg-config GraphicsMagick-config”,没关系。

0 投票
1 回答
656 浏览

linker - Go - LDFLAGS: -w -hostobj 给出错误

我正在编写一个调用 C 代码的 Go 包。我需要调用主机链接器,但不幸的是添加-hostobj标志会给我以下错误:

操作系统是Linux,架构amd64。

以下是所有标志:

我究竟做错了什么?

0 投票
1 回答
5380 浏览

c - 从 []byte 到 char*

我想包装一个 C 函数,它char*指向一个非空字节缓冲区(的第一个元素)。我正在尝试使用 CGo 将其包装在 Go 函数中,以便可以将其传递 a []byte,但我不知道如何进行转换。C 函数签名的简化版本是

我尝试将指针传递给byte切片中的第一个指针

但是,这不会编译:

那么这里的正确程序是什么?go-wiki只描述了相反的情况。

0 投票
1 回答
2334 浏览

opengl - 在 Go 中使用 OpenGL

我正在尝试在 Go 程序中使用 OpenGL。我我已经准备好了所有的部分,但我仍然不能让它运行起来。

我的 C 编译器是64 位版本的 mingw。它在我的%PATH%变量中,并且我已经验证它与cgo文档中的随机数示例一起使用。

\mingw\x86_64-w64-mingw32我通过将 bin、lib 和 include 文件夹复制到我的 mingw-w64 安装中的等效文件夹来安装 64 位 GLEW 1.9.0 。

当我尝试运行go get github.com/go-gl/gl时,请回复以下内容:

对于不超过 的值,这些错误会以类似的方式继续存在__cgo_enum__15。对于每个条目,我还收到来自 Go 方面的一些匹配错误。

关于我缺少什么以使其正常工作的任何想法?

编辑:这是来自 Go 方面的“匹配”日志。

__cgodebug_data[]每5-15个就有一个。

编辑 2:我被要求附上一些日志。这是我使用 GCC 4.8 编译时发生的情况这是我使用 4.7 和 4.6 得到的结果

0 投票
1 回答
3696 浏览

windows - 在 cgo 中使用 Windows 库

我正在尝试构建一个使用TagLib的 Go 包,但在弄清楚如何将编译后的库与 cgo 一起使用时遇到了一些麻烦。

我已经编译了 TagLib,它吐出了tag.dll, tag.exp, 和tag.libtaglib目录中。在 bindings 目录中也有taglib_c.*二进制文件,但我假设我只是忽略了这些。

如何使用已编译的库与 Go 一起使用?我在 OS X 上的项目的源代码中设置了所有内容,但是我需要做什么才能使其在 Windows 上编译?编译后的库(dll 还是静态库?)是否必须与源代码位于同一目录中?标题呢?

0 投票
2 回答
863 浏览

go - 我可以通过 CGo 定义接受本机 Go 类型的 C 函数吗?

对于我正在做的与现有库集成的工作,我最终需要编写一些额外的 C 代码来提供可通过 CGo 使用的接口。

为了避免冗余数据副本,我希望能够将一些标准 Go 类型(例如 Go 字符串)传递给这些 C 适配器函数。

我可以看到 CGo 生成的头文件中定义了一些类型GoStringGoInterface供导出的 Go 函数使用,但是有什么方法可以在 CGo 识别的我自己的函数原型中使用这些类型?

目前,我最终void *在 C 原型中使用并unsafe.Pointer(&value)在 Go 端传递。这不像我想要的那样干净(一方面,它使 C 代码能够写入值)。

更新:

为了清楚起见,我确实知道 Go 的原生字符串类型和 C 之间的区别char *。我的观点是,因为无论如何我都会复制传递给我的 C 函数的字符串数据,所以让 Go 端的代码自己复制是没有意义的。

我也知道字符串布局在 Go 的未来版本中可能会发生变化,并且它的大小可能因平台而异。但是 CGo 已经通过_cgo_export.h它为我生成的文档标头向我公开了与当前平台匹配的类型定义,因此谈论它未指定似乎有点奇怪:

但是似乎没有办法在 CGo 可见的原型中使用这个定义。我并不太担心二进制兼容性,因为使用这个定义的代码将是我的 Go 包的一部分,所以源代码级别的兼容性就足够了(如果那样的话,更新包也没什么大不了的情况并非如此)。

0 投票
4 回答
52174 浏览

go - 你如何使用 cgo 在 go 中静态链接 ac 库?

因此,小组中有很多东西建议您可以在 go 中执行此操作(尽管不在 cgo 文档中):

但是,它似乎不起作用:

使用动态库似乎可以正常工作,并检查生成的文件,它实际上有符号“x”:

但显然只是bridge.cgo2.o中的一个标记:

我究竟做错了什么?

对于 ref,c 标头:

和代码:

--

编辑:

不,-L 和 -l 也不起作用;实际上在google group上有一些具体的讨论,这个(-l/blah/blah.a)不适用于cgo,正确的语法实际上是省略-l而只列出.a文件......但是嘿,如果它有效,我完全会使用它。但它没有:

详细版本:

值得注意的是,当您尝试像这样(使用 -l)链接时失败是典型的 gcc 链接失败,因为您正在尝试组合一组目标文件。

IE。这个:

永远不会在 gcc 下编译;你必须像这样链接一个静态库:

IE。绝对不是我缺少-l 或-L。

0 投票
2 回答
17601 浏览

linker - 是否可以在 cgo CFLAGS 注释中使用环境变量?

我正在尝试为 Go 语言编写一些 C 绑定,并且在 Windows 中设置 Cgo 编译时遇到了一种棘手的情况。我的代码如下所示:

这使我可以避免将 Dll、库和头文件直接安装到我的 C:\Windows 目录中,但是当其他开发人员使用不同的文件系统设置时(他们都需要库在 C:/dev/extlibs/...)。

有没有办法可以从代码中引用环境变量?也许是这样的:

或者人们是否有另一种方法可以解决我错过的这个问题?我花了一些时间在这个主题上搜索并没有看到太多有用的东西,所以任何信息和/或资源都可能是真正的帮助!