2010-11-09 42 views
8

是否可以动态加载外部C库(dll)并在Go中调用其函数?Go动态FFI

我知道有用于静态绑定到C函数的cgo,但我对动态方式感兴趣。

回答

6

简答:没有。 (至少不与GC,gccgo是gcc联然而,所以它可能是可能的)

中回答:但是,您可以静态绑定,也就是说,libffi或libdl然后用动态加载其他库。

长答案:您可以使用go工具链C编译器和汇编器(例如,参见src/pkg/runtime)在C和ASM中编写go软件包。所以你可以在C或ASM中编写一个FFI作为一个包。

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

另外,也可以使用syscallunsafe包(很容易在窗口中完成,但我想这将是在linux更难,并非遥不可及上面的第三个解决方案)。

http://code.google.com/p/go/wiki/CallingWindowsDLLs

+0

我喜欢中等答案,也许我会尝试。至于长时间的答案,可惜的是,这样的事情已经不是标准软件包的一部分。 – Marko 2010-11-09 14:43:14

+0

难道不是通过使用http://golang.org/pkg/syscall/ LoadLibrary完成的吗?我记得有人编写了代码,可以让你在Go中动态地调用dll中的任何函数,但是我再也找不到这个例子。 – jcao219 2010-11-10 00:19:52

+0

@ jcao219我还没有看到,但它只是窗户。你还需要一种方法来调用库例程和Go – cthom06 2010-11-10 12:56:25