2014-06-10 40 views
5

我有一個.so文件,其功能我想在我的Go代碼中調用。如何在Go中調用Linux共享庫函數?

我該如何去做呢?我已經閱讀了cgo和syscall軟件包。他們接近我想要的,但我沒有看到任何可以在.so文件中調用函數的地方。

我想實現Python中ctypes包的功能。

有人可以幫忙嗎?

+0

[我可以與Go(Google)編程語言使用共享對象嗎?](http://stackoverflow.com/questions/2254777/can-i-use-shared-objects-with-go-google-編程語言) – OneOfOne

回答

4

如果要在編譯時使用靜態已知的共享庫,則可以簡單地使用cgo。閱讀關於如何做到這一點的文檔,但通常你會指定一些鏈接器標誌和一些註釋掉的行。以下是如何從libfoo.so調用功能bar()的示例。

package example 

// #cgo LDFLAGS: -lfoo 
// 
// #include <foo.h> 
import "C" 

func main() { 
    C.bar() 
} 

您還可以使用cgo訪問在運行時動態加載的共享對象。您可以使用dlopen(),dlsym()dlclose()來打開共享庫,檢索其中一個函數的地址並最終關閉該庫。注意,你不能在Go中做這些事情,你必須在C中編寫一些包裝代碼,爲你實現必要的邏輯。

+0

我看到我必須在註釋部分指定頭部函數,然後調用它們。讓我看看我能做些什麼。 –

+0

@AgnivaDeSarker我可能會誤解你的問題。讓我重述一下我的答案。 – fuz

+0

是的,這就是我想要的!我只是錯過了LDFLAGS部分。 –