问题标签 [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.
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 在同一目录中)?谢谢!如果您需要我错过的额外信息,请询问。
亚历克斯
go - Golang (cgo) - 任意 void* 接口
我正在包装一个 C 库,该库具有一个带有 void* 数据字段的结构,可用于任意保存数据。将其包装在惯用的 Go 中的最佳方式(如果可能的话)是什么?
结构很简单:
我希望做类似的事情:
这是行不通的,而且显然是错误的方法。
我已经使用 []byte 源成功地设置了一个带有长度字段的 void* 数据,但是这个无长度接口让我无法理解。
go - cgo 和 pkg-config
我想用 cgo 运行 GraphicsMagick。
然后我运行“安装”,它说:
但我在 shell 中运行“pkg-config GraphicsMagick-config”,没关系。
linker - Go - LDFLAGS: -w -hostobj 给出错误
我正在编写一个调用 C 代码的 Go 包。我需要调用主机链接器,但不幸的是添加-hostobj
标志会给我以下错误:
操作系统是Linux,架构amd64。
以下是所有标志:
我究竟做错了什么?
c - 从 []byte 到 char*
我想包装一个 C 函数,它char*
指向一个非空字节缓冲区(的第一个元素)。我正在尝试使用 CGo 将其包装在 Go 函数中,以便可以将其传递 a []byte
,但我不知道如何进行转换。C 函数签名的简化版本是
我尝试将指针传递给byte
切片中的第一个指针
但是,这不会编译:
那么这里的正确程序是什么?go-wiki只描述了相反的情况。
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 得到的结果。
windows - 在 cgo 中使用 Windows 库
我正在尝试构建一个使用TagLib的 Go 包,但在弄清楚如何将编译后的库与 cgo 一起使用时遇到了一些麻烦。
我已经编译了 TagLib,它吐出了tag.dll
, tag.exp
, 和tag.lib
在taglib
目录中。在 bindings 目录中也有taglib_c.*
二进制文件,但我假设我只是忽略了这些。
如何使用已编译的库与 Go 一起使用?我在 OS X 上的项目的源代码中设置了所有内容,但是我需要做什么才能使其在 Windows 上编译?编译后的库(dll 还是静态库?)是否必须与源代码位于同一目录中?标题呢?
go - 我可以通过 CGo 定义接受本机 Go 类型的 C 函数吗?
对于我正在做的与现有库集成的工作,我最终需要编写一些额外的 C 代码来提供可通过 CGo 使用的接口。
为了避免冗余数据副本,我希望能够将一些标准 Go 类型(例如 Go 字符串)传递给这些 C 适配器函数。
我可以看到 CGo 生成的头文件中定义了一些类型GoString
,GoInterface
供导出的 Go 函数使用,但是有什么方法可以在 CGo 识别的我自己的函数原型中使用这些类型?
目前,我最终void *
在 C 原型中使用并unsafe.Pointer(&value)
在 Go 端传递。这不像我想要的那样干净(一方面,它使 C 代码能够写入值)。
更新:
为了清楚起见,我确实知道 Go 的原生字符串类型和 C 之间的区别char *
。我的观点是,因为无论如何我都会复制传递给我的 C 函数的字符串数据,所以让 Go 端的代码自己复制是没有意义的。
我也知道字符串布局在 Go 的未来版本中可能会发生变化,并且它的大小可能因平台而异。但是 CGo 已经通过_cgo_export.h
它为我生成的文档标头向我公开了与当前平台匹配的类型定义,因此谈论它未指定似乎有点奇怪:
但是似乎没有办法在 CGo 可见的原型中使用这个定义。我并不太担心二进制兼容性,因为使用这个定义的代码将是我的 Go 包的一部分,所以源代码级别的兼容性就足够了(如果那样的话,更新包也没什么大不了的情况并非如此)。
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。
linker - 是否可以在 cgo CFLAGS 注释中使用环境变量?
我正在尝试为 Go 语言编写一些 C 绑定,并且在 Windows 中设置 Cgo 编译时遇到了一种棘手的情况。我的代码如下所示:
这使我可以避免将 Dll、库和头文件直接安装到我的 C:\Windows 目录中,但是当其他开发人员使用不同的文件系统设置时(他们都需要库在 C:/dev/extlibs/...)。
有没有办法可以从代码中引用环境变量?也许是这样的:
或者人们是否有另一种方法可以解决我错过的这个问题?我花了一些时间在这个主题上搜索并没有看到太多有用的东西,所以任何信息和/或资源都可能是真正的帮助!