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

garbage-collection - 垃圾收集和cgo

是否可以让 Go 中的垃圾收集器处理并释放通过 C 代码分配的内存?抱歉,我之前没有使用过 C 和 cgo,所以我的示例可能需要澄清一下。

假设您有一些想要使用的 C 库,并且该库分配了一些需要手动释放的内存。我想做的是这样的:

当 Go 运行时中没有对 *Stuff 的引用时,垃圾收集器有什么方法可以调用 Stuff.Free() 吗?

我在这里有意义吗?

也许更直接的问题是:是否有可能通过编写一个在对该对象的引用为零时运行时调用的函数来使运行时自动处理 C 分配的内存的清理?

0 投票
1 回答
2490 浏览

windows - cgo - 如何将 go 字符串转换为 LPCWSTR

我想使用一些 windows api,但我不知道如何开始。有没有它的教程?

无论如何,我有一个简单的代码。你能帮我纠正一下吗?

编辑:我可以处理 char* 但仍然不知道 wchar_t* 是什么。

如果这不是成语,请告诉我。

0 投票
1 回答
1640 浏览

opengl - Windows DLL 链接与 cgo

我的最终目标是从 Go 包中成功链接到多个 DLL(opengl32.dll glfw.dll 和 glu32.dll)——但尝试链接到 go-glfw 包给了我“未定义”错误

所以我决定从 %GOROOT%\misc\cgo\life 中的简单未修改示例中获取一个非常简单的 cgo 动态/共享库链接来工作。但只是调用命令go build -o life main.go失败,并出现基本相同的链接器错误,即:

“未定义”...与我在尝试按照上述链接 glfw 时遇到的错误完全相同。

这是今天早上刚下载的 Go 1.0.1 的全新未篡改安装,安装在一个普通的、相当新的 Win7 64 位安装上。什么可能出错?我知道... Windows。很想听听任何想法……从我在网上阅读的内容来看,与 CGO 链接的 DLL 似乎是一件轻而易举的事情。然而,即使是最简单的例子对我来说也失败了。

0 投票
3 回答
4873 浏览

gcc - 通过 Windows cgo->gcc->ld 的 DLL 链接给出“未定义的引用到(函数)”错误

(非常详细的问题报告——tl;dr 在底部!)

我真的更喜欢 GLFW 而不是 Glut,并且希望它的Golang 绑定在 Windows 64 位和 Go 1.0.1 64 位下工作。在 Linux 下,它的绑定工作完美无缺。这在 Windows 下原则上是可行的——GitHub 用户 chsc已经设法做到,但他在 Win32 上,他的提示还没有解决我的问题。但是我确实有一个基于 tdm64-gcc-4.6.1 的完整而干净的 Mingw64 设置。

现在奇怪的是——让 freeglut 绑定在 64 位 Windows 下工作,64 位 Go 1.0.1工作——glfw 绑定对我来说失败了。我想弄清楚为什么,因为它们本质上都使用相同的 cgo 特性和技术

注意我目前有一个自制的半生不熟但基本上可以工作的替换包,它使用 LoadLibrary/GetProcAddress 调用在 Go 中公开 glfw.dll。这可行,但我认为硬链接的编译 CGO 绑定比无数的 Syscall()、Syscall6()、Syscall9()、Syscall12() 等 Go func 调用更可取。如果 Win32 和 Linux gophers 可以拥有这个,为什么我们 Win64 的人不能呢?

所以这是我到目前为止的设置:

  1. 我有一个带有三个补丁的 Golang 构建,以使 lib 链接与 cgo应用一起工作
  2. 我已经使用 MinGW64 成功地将最新的 freeglut 和 GLFW 库编译为 64 位 DLL。
  3. 头文件glut.h、freeglut*.h和glfw.h放在\MinGW64\x86_64-w64-mingw32\include\GL(gl.h、glaux.h、glu.h旁边)
  4. Lib 文件 libfreeglut.a 和 libglfwdll.a 放在 \MinGW64\x86_64-w64-mingw32\lib (在 libglu32.a、libopengl32.a 旁边)
  5. 64 位 DLL glfw.dll 和 freeglut64.dll 被放置在 \windows 和 \windows\system32 中(在 opengl32.dll、glu32.dll 旁边)
  6. 我相信freeglut64.dll 和 glfw.dll都可以工作——至少他们的大多数示例程序在安装 DLL 后都可以工作。

一切都应该到位,对吧?现在首先要成功绑定(我不需要),freeglut - 当我去 get -x github.com/zombiezen/Go-GLUT/glut时,一切都构建得很好,我可以成功创建一个过剩窗口和在从 .go 源文件编译的 Windows test.exe 中显示一个三角形。感谢 -x,go get 显示了它的构建功能:

为了达到这一点,我不得不稍微修改一下 glut.go 如下:

因此,总而言之,这构建得很好,可以从 Go 导入和链接并在代码中使用。

现在为 GLFW。GO 文件的内容与 glut.go 极为相似:

#define GLFW_DLL不会发生静态链接。这是go get -x github.com/jteeuwen/glfw的输出:

是的,这是一个拗口——但基本上总是同样的错误,而且在构建过程中相当晚。请注意,如果未定义#define GLFW_DLL,我将得到基本相同的输出,除了没有 __imp_ 前缀——静态链接既不鼓励 Go,也不适合这个特定用例。

现在,当 gcc 抱怨“未定义的引用”时,从我的谷歌搜索来看,可能有各种原因......

  • 找不到 DLL 不可能是失败的——它们在适当的位置,对于 freeglut64.dll 它可以工作
  • 不可能找不到 .a 库——它们位于适当的位置,并且 libfreeglut.a 有效,如果我将 -lglfwdll 更改为 -lblafoobar 则 gcc 会更早失败并正确地抱怨“找不到 blafoobar”——所以它确实找到了 libglfwdll.a。
  • lib依赖的顺序?我尝试将 -lglfwdll 作为第一个库(在 -lglu32 -lopengl32 之前)和作为最后一个库(在这两个库之后),没有区别。
  • Golang glfw 绑定有问题吗?不这么认为,适用于其他人,包括在 Windows 下用于 chsc(虽然是 32 位)

TL;DR——在 Windows 64 位、Go 1.0.1 64 位完全修补下,CGO 成功生成内容以供freeglut 和 glfw输入GCC。然后 GCC 很高兴地吃掉这些东西来构建 freeglut 绑定,拒绝它来构建 glfw 绑定,所有 C.funcs() 都有“未定义的引用”。libfreeglut 和 libglfwdll 都正确构建并安装为 64 位 DLL 和正确定位的 .h/.a 库。可能是什么原因?

0 投票
1 回答
428 浏览

gcc - “go get”不只是获取文件然后 cgo+“go build”它们吗?显然不是

我在构建一个相当简单的本地 CGO 项目时遇到问题。考虑这个只有 3 个文件(glut.go、support.c 和 support.h 文件)的非常小的 CGO 包——如果我只是去获取它,这些文件将下载到

然后发生了一些秘密魔法并go get构建以下输出文件:

但是,如果我将三个源文件复制到 \mytmp,cd 到 \mytmp 并go build -o glut.a glut.go,我会收到一些 40-60 错误消息,如下所示:

如果我使用-x命令行参数运行go get,我可以看到support.c在构建过程中被拾取并提供给 gcc:

但是,使用go build -x时,情况并非如此,support.c 被跳过。为什么?我如何调用go buildgo get一样工作?

0 投票
2 回答
1501 浏览

opengl - OpenGL 的 glClear() 导致 Windows 64 中的访问冲突 (0xc0000005)

看看这个用 Go 编写的超级简单的小测试用例 OpenGL 程序:

这在带有 Go 1.0.1 64 位的 Windows 7 64 位下构建良好。

如果您取出(或注释掉)gl.Clear(gl.COLOR_BUFFER_BIT)行,它也可以正常工作(OpenGL 绘制一个彩虹色的 2D 三角形,直到窗口关闭) 。

但是,只要调用 gl.Clear(无论传递什么参数),它都会崩溃,Windows 会通知我“glfw-win.exe 已停止工作......”并且 Windows 事件查看器为我提供以下错误日志:

现在,有几个值得注意的点...

  1. glfw包只是一个自定义包,它公开与github.com/jteeuwen/glfw完全相同的 API,但在内部使用 LoadLibrary/GetProcAddress 来使用 glfw.dll 而不是编译时 CGO/GCC/LD 链接——因为后者不能可悲的是,它可以在 64 位 Windows 中工作,不确定是 mingw64 还是 gcc 还是 cgo 是罪魁祸首。使用 LoadLibrary/GetProcAddress 调用我的 glfw.dll 的自定义 64 位版本运行良好。显然这里的问题是调用 gl 包,而不是 glfw。

  2. gl包确实就是这个,未经修改。我尝试了一些 LDFLAGS 修改,例如 -m64 -lmingw32 -Wl,/windows/opengl32.dll 等,但没有区别,只要不调用 gl.Clear(),原始工作与修改后的工作一样好,所以我恢复到原来的。当然,稍后我将继续使用 OpenGL 4.2。

  3. 使用 Process Explorer,我可以看到我的进程是 64 位的,并且所有加载的 DLL 也是 64 位图像(包括 opengl32.dll 和 glfw.dll)。

  4. “难道是gl21包无法为opengl32.dll导出的glClear()函数获取有效地址?” -- 不太可能:根据第 2926 行,如果是这种情况,我对 gl.Init() 的调用将失败。

  5. GPU驱动问题?更不可能了。安装了最新的官方 nVidia Quadro 5010M 驱动程序 296.35。还尝试了“性能驱动程序”,但无论如何似乎是完全相同的驱动程序。根据 nVidia 控制面板的完整 OpenGL 4.2 支持(尽管 opengl32.dll 的日期为 2009 年——无论如何,我目前的目标是 2.1)。此外,“Geeks3D GPU Caps Viewer”和“Shader Toy Mark”中的 OpenGL 着色器运行,正如 GLFW 示例程序particles.exe 一样——它们都使用 glClear()。

  6. 使用 gl42 而不是 gl21 时会发生完全相同的问题,所以这也不是原因。

请注意在此示例中所有其他 gl.SomeExportedFunc() 调用如何不会崩溃...

该怎么做,如何进行?

如果这只发生在 gl.Clear() 而没有其他函数,我可以忍受这个——无论如何,我只是用自定义内容渲染全屏四边形——但我在这里测试 Win64 相当早(得到许多 gl42 代码在 Linux64 下工作得很好,现在即将“移植”到 Win64),我担心以后进一步的调用会暴露同样的问题,所以我现在报告这个。我很快就会发现哪些其他电话会受到此影响。

0 投票
2 回答
1558 浏览

go - Go 中的条件编译

我正在尝试使用CGoENet编写一个 Go包装器

当我尝试在 Mac 上编译包装器时,库较旧并且界面略有不同。99% 的代码是相同的,只是需要更改几个 C 调用。

在 Go 中处理此类问题的最佳实践是什么?
有没有办法进行条件编译或条件导入?

0 投票
2 回答
471 浏览

android-ndk - 是否可以使用带有 cgo 和/或 SWIG 或类似工具的 NDK 在 Go 中构建 Android 游戏?

是否可以使用 Go 来构建 Android 游戏?我不喜欢主题行中提到的技术。我知道有些人在 Go 中构建了一些 Android 程序,但他们可能是无头的。

0 投票
2 回答
1708 浏览

eclipse - 如何在带有 Mingw 的 Goclipse 中使用 cgo?

当我尝试使用 cgo 时出现错误

exec gcc: exec: "gcc": 在 %PATH% 中找不到可执行文件

我已经安装了Mingw。我如何告诉 Goclipse gcc 在哪里?我无法在首选项或属性中找到设置它的方法。

0 投票
1 回答
9661 浏览

c++ - 我可以在 cgo 中使用 c++ 吗?

是否可以在 cgo 中混入一些 C++ 代码?

我试过这个:

但我得到这些错误:

我正在使用 go1.0.2 和 MinGW-w64 4.7.1