Go 中的动态 FFI
是否可以动态加载外部C库(dll)并在Go中调用其函数?
我知道有 cgo
用于静态绑定到 C 函数,但我对动态方式感兴趣。
Is it possible to dynamically load foreign C library (dll) and call its functions in Go?
I know there is cgo
which is used to statically bind to C functions, but I'm interested in dynamic way.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
简短的回答:不。 (至少不能使用 gc,但是 gccgo 是 gcc 可链接的,所以它可能是可能的)
中等答案:但是,您可以静态绑定,例如 libffi 或 libdl,然后使用它动态加载其他库。
长答案:您可以使用 go 工具链 C 编译器和汇编器以 C 和 ASM 编写 go 包(例如,请参阅 src/pkg/runtime)。因此,您可以使用 C 或 ASM 将 FFI 编写为 go 包。
编辑:从下面的评论(现在也是CW)
或者,可以使用
syscall
和unsafe
包来完成(在Windows中很容易,但我想在Windows中会更难) linux,与上面的第三种解决方案相差不远)。http://code.google.com/p/go/wiki/CallingWindowsDLLs
Short answer: no. (at least not with gc, gccgo is gcc linkable however, so it might be possible)
Medium answer: However, you can statically bind, say, libffi or libdl and then use it to dynamically load other libraries.
Long answer: You can write go packages in C and ASM using the go toolchains C compiler and assembler (see src/pkg/runtime for example). So you could write a FFI in either C or ASM as a go package.
Edit: From the comments below (also CW now)
Alternatively, it can be done using the
syscall
andunsafe
packages (easily in windows, but I imagine it would be harder in linux and not far off from the third solution above).http://code.google.com/p/go/wiki/CallingWindowsDLLs