Tomber amoureux de Golang, C / C ++ ne veut pas abandonner. Heureusement, le langage Go fournit un mécanisme pour s'appeler les uns les autres avec le langage C (CGO). Incluez les questions suivantes
- C / C ++ appelle les bibliothèques écrites dans les programmes Go.
- Le langage Go appelle les bibliothèques dynamiques et statiques C / C ++.
- Programme de rappel de langue Go appels en langage C (rappel)
- Passer des paramètres entre les fonctions
Cet article aborde d'abord les deux premiers problèmes.
Go et C ++ s'appellent mutuellement est une chose très significative. Le langage Go est beaucoup plus efficace que C / C ++ lors de l'écriture de programmes réseau, de services cloud et d'autres programmes. Quelques lignes suffisent pour écrire un serveur Web dans Go. C ++ est un peu plus pratique lorsqu'il s'agit d'interfaces de bas niveau.
Appel C / C ++ Go
Commencez par écrire un programme go
package main
import "C"
import (
"fmt"
)
//export Foo
func Foo(a, b int) int {
return a + b;
}
//export Bar
func Bar() {
fmt.Println("Say Hello From Go")
}
func main() {}
Remarque: Le commentaire // export Foo et // export Bar signifie exporter deux fonctions
Compiler
go build -o golib.so -buildmode=c-shared *.go
Deux fichiers sont générés dans le répertoire:
golib.h
golib.so
Programme principal en langage C
#include "golib.h"
#include <stdio.h>
int main() {
printf("%lld\n",Foo(1,2));
Bar();
return 0;
}
Compiler
gcc callgo.c -o callgo ./golib.so
Aller appelle C / C ++
Code de bibliothèque de langage C (hello.c)
#include <stdio.h>
void hello(int i) {
printf("Hello C: %d\n", i);
}
salut
void hello(int);
Go appelle la bibliothèque dynamique C
Compiler une bibliothèque dynamique
gcc -fPIC -shared -o libhello.so hello.c
Créez un répertoire de bibliothèque mylib et copiez libhello.so dans le répertoire mylib. Et affichez le chemin du chemin:
export LD_LIBRARY_PATH=./mylib
aller code
package main
// #cgo CFLAGS: -I./mylib
// #cgo LDFLAGS: -L./mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
compilation de programmes aller
go build CallC.go
Go appelle la bibliothèque statique C
Première compilation et compilation de la bibliothèque statique C
gcc -Wall -c hello.c
ar -rv libhello.a hello.o
Copiez libhello.a dans la cible mylib.
Il y a un problème ici: de nombreux articles sur Internet disent que les programmes GO et les connexions dynamiques sont les mêmes, mais ce n'est pas le cas. Le programme go doit être:
package main
// #cgo CFLAGS: -I./mylib
// #cgo LDFLAGS: ./mylib/libhello.a
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
Définissez cgo LDFLAGS comme nom de fichier statique // #cgo LDFLAGS: ./mylib/libhello.a
Et la commande de compilation est la même
go build CallC.go