Go 中的动态 FFI

发布于 2024-09-30 23:39:16 字数 107 浏览 7 评论 0原文

是否可以动态加载外部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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

揪着可爱 2024-10-07 23:39:16

简短的回答:不。 (至少不能使用 gc,但是 gccgo 是 gcc 可链接的,所以它可能是可能的)

中等答案:但是,您可以静态绑定,例如 libffi 或 libdl,然后使用动态加载其他库。

长答案:您可以使用 go 工具链 C 编译器和汇编器以 C 和 ASM 编写 go 包(例如,请参阅 src/pkg/runtime)。因此,您可以使用 C 或 ASM 将 FFI 编写为 go 包。

编辑:从下面的评论(现在也是CW)

或者,可以使用syscallunsafe包来完成(在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 and unsafe 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文