2010-11-09 22 views
8

Est-il possible dynamiquement charger la bibliothèque C étrangère (dll) et appeler ses fonctions dans Go?FFI dynamique dans Go

Je sais qu'il y a cgo qui est utilisé pour lier statiquement aux fonctions C, mais je suis intéressé par la manière dynamique.

Répondre

6

Réponse courte: non. (Au moins pas avec gc, gccgo est liable gcc cependant, il pourrait être possible)

réponse moyenne: Cependant, vous pouvez lier statiquement, par exemple, libffi ou libdl puis utilisez il pour charger dynamiquement d'autres bibliothèques. Réponse longue: Vous pouvez écrire des paquetages aller en C et ASM en utilisant le compilateur et l'assembleur de chaînes d'outils go (voir src/pkg/runtime par exemple). Vous pouvez donc écrire un FFI dans C ou ASM comme un paquet go.

Edit: D'après les commentaires ci-dessous (également CW maintenant)

Alternativement, il peut être fait en utilisant les paquets syscall et unsafe (facilement dans les fenêtres, mais j'imagine que ce serait plus difficile dans linux et non loin de la troisième solution ci-dessus).

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

+0

J'aime réponse moyenne, je vais peut-être essayer. Pour ce qui est des réponses longues, c'est dommage que quelque chose comme ça ne fasse pas partie des paquets standard. – Marko

+0

N'est-ce pas simplement en utilisant http://golang.org/pkg/syscall/ LoadLibrary? Je me souviens que quelqu'un avait un code écrit qui vous permettait d'appeler facilement n'importe quelle fonction à l'intérieur d'une DLL de Go, mais je ne trouve plus cet exemple. – jcao219

+0

@ jcao219 Je n'avais pas vu ça, mais ce n'est que des fenêtres. Et vous avez toujours besoin d'un moyen d'appeler entre les routines de la bibliothèque et Go – cthom06