2014-06-10 14 views
5

Ho un file .so le cui funzioni mi piacerebbe chiamare nel mio codice Go.Come posso chiamare le funzioni di libreria condivisa di Linux in Go?

Come faccio a farlo? Ho letto il pacchetto cgo e syscall. Sono vicini a quello che voglio ma non vedo alcun posto dove posso chiamare le funzioni nel file .so.

Voglio ottenere esattamente ciò che fa il pacchetto ctypes in Python.

Qualcuno può aiutare?

+0

possibile duplicato di [Posso utilizzare oggetti condivisi con il linguaggio di programmazione Go (Google)?] (Http://stackoverflow.com/questions/2254777/can-i-use-shared-objects-with-go-google- linguaggio di programmazione) – OneOfOne

risposta

4

Se si desidera utilizzare una libreria condivisa che è nota staticamente in fase di compilazione, è sufficiente utilizzare cgo. Leggi la documentazione su come farlo esattamente, ma di solito specifichi alcuni flag linker e un paio di righe commentate. Ecco un esempio su come chiamare la funzione bar() da libfoo.so.

package example 

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

func main() { 
    C.bar() 
} 

È inoltre possibile utilizzare cgo per accedere agli oggetti condivisi che vengono caricati dinamicamente in fase di runtime. È possibile utilizzare dlopen(), dlsym() e dlclose() per aprire una libreria condivisa, recuperare l'indirizzo di una delle funzioni all'interno e infine chiudere la libreria. Nota che non puoi fare queste cose in Go, devi scrivere un codice wrapper in C che implementa la logica necessaria per te.

+0

Vedo che devo specificare la funzione di intestazione nella sezione commenti e quindi chiamarli. Fammi vedere cosa posso fare. –

+0

@AgnivaDeSarker Potrei aver frainteso un po 'la tua domanda. Lasciami riformulare la mia risposta. – fuz

+0

Sì, questo è quello che volevo! Mi mancava solo la parte LDFLAGS. –

Problemi correlati