Appel mutuel entre GO et C (1)

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 

 

Je suppose que tu aimes

Origine blog.csdn.net/yaojiawan/article/details/108991989
conseillé
Classement