2010-11-09 66 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