Go et c

Pages: 12 (2929 mots) Publié le: 29 avril 2012
Interactions C/C++ et Go

Auteurs : Yi Wang, Gustavo Niemeyer, Andrew Gerrand, adg, Xavier Méhaut

V1.0

Sommaire
Préambule .............................................................................................................................................. 3 Appel d’une DLL Windows à partir de Go (adg)..................................................................................... 3 Bases de l’encapsulation du C en Go (Gustavo Niemeyer) ..................................................................... 4 La commande cgo (golang.org) ............................................................................................................. 6 C? Go? Cgo! (Andrew Gerrand).............................................................................................................. 7 Callbacks avec cgo (Ostsol) .................................................................................................................. 10 Linker statiquement du code C++ avec du code en Go (YI Wang) ...................................................... 14 Plus de ressources concernant SWIG et GO ?.................................................................................. 16

Préambule
Go permet d’appeler du code C voire C++ , soit en chargeant une bibliothèque partagée (.so, .dll), soit en intégrant le code Go directement avec du C (cgo, swig).

Appel d’une DLL Windows à partir de Go (adg)
Un simple exemple d’appel de DLL windows en Go:
package main import ( "syscall" "unsafe" "fmt" ) func abort(funcname string, err int) { panic(funcname + "failed: " + syscall.Errstr(err)) } var ( kernel32, _ = syscall.LoadLibrary("kernel32.dll") getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW") user32, _ messageBox, _ "MessageBoxW") ) const ( MB_OK MB_OKCANCEL MB_ABORTRETRYIGNORE MB_YESNOCANCEL MB_YESNO MB_RETRYCANCEL MB_CANCELTRYCONTINUE MB_ICONHAND MB_ICONQUESTION MB_ICONEXCLAMATION MB_ICONASTERISK MB_USERICON MB_ICONWARNINGMB_ICONERROR MB_ICONINFORMATION MB_ICONSTOP MB_DEFBUTTON1 = = = = = = = = = = = = = = = = 0x00000000 0x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000010 0x00000020 0x00000030 0x00000040 0x00000080 MB_ICONEXCLAMATION MB_ICONHAND MB_ICONASTERISK MB_ICONHAND = syscall.LoadLibrary("user32.dll") = syscall.GetProcAddress(user32,

= 0x00000000

MB_DEFBUTTON2 MB_DEFBUTTON3MB_DEFBUTTON4 )

= 0x00000100 = 0x00000200 = 0x00000300

func MessageBox(caption, text string, style uintptr) (result int) { ret, _, callErr := syscall.Syscall9(uintptr(messageBox), 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), style, 0, 0, 0, 0, 0) if callErr != 0 { abort("Call MessageBox", int(callErr)) } result =int(ret) return } func GetModuleHandle() (handle uintptr) { if ret, _, callErr := syscall.Syscall(uintptr(getModuleHandle), 0, 0, 0); callErr != 0 { abort("Call GetModuleHandle", int(callErr)) } else { handle = ret } return } func main() { defer syscall.FreeLibrary(kernel32) defer syscall.FreeLibrary(user32) fmt.Printf("Retern: %d\n", MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL)) }func init() { fmt.Print("Starting Up\n") }

Bases de l’encapsulation du C en Go (Gustavo Niemeyer)
Avec CGo, le nom donné au mécanisme d’intégration d C avec Go, on declare simplement une instruction d’importation special qui indique au pré-processeur de regarder dans le commentaire le precedent pour y trouver les informations nécessaire à l’intégration voulue.

Quelque chose comme ceci :
//#include import "C"

Le commentaire n’a pas à se restreindre à une seule ligne, ou même à des instructions de type #include. Le code C contenu dans le commentaire sera inséré de manière transparente à l’intérieur du fichier C qui est compilé et linké avec le fichier obj final. Du côté Go, l’import “C” est simulé comme si c’était un import normal de telle manière que les fonctions C, les...
Lire le document complet

Veuillez vous inscrire pour avoir accès au document.

Vous pouvez également trouver ces documents utiles

  • Okey go!
  • Go sport
  • Go home
  • Go sport
  • Joeuse de go
  • Go sport
  • Go sport
  • Go sport

Devenez membre d'Etudier

Inscrivez-vous
c'est gratuit !