Maison >développement back-end >Golang >Comment intégrer des fonctions Go dans des projets C existants à l'aide de GCCGO ?

Comment intégrer des fonctions Go dans des projets C existants à l'aide de GCCGO ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 22:42:02903parcourir

How to Integrate Go Functions into Existing C Projects Using GCCGO?

Utilisation de Go dans des projets C existants

Contexte :
Vous disposez d'un programme C composé de plusieurs objets fichiers stockés dans un fichier d’archive (.a). Vous avez l'intention d'ajouter un nouveau fichier Go au projet, de le compiler dans un fichier objet et de l'incorporer dans l'archive existante.

Objectif :
Intégrer les fonctions Go dans votre C programme.

Processus :

1. Compilez le fichier Go dans un fichier objet :

  • Exécutez la commande suivante :

    gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native

2. Appelez les fonctions Go depuis C :

  • Dans votre fichier c_caller.c, déclarez une fonction externe :

    extern int PrintString(char*) __asm__ ("print.main.PrintString");
  • Dans le fonction principale, appelez la fonction Go et gérez le résultat :

    int result = PrintString(string_to_pass);
    if (result) { printf("Everything went as expected!\n"); }
    else       { printf("Uh oh, something went wrong!\n"); }

3. Utiliser GCCGO pour créer l'intégralité du projet :

  • Exécutez la commande suivante :

    gccgo -o main c_caller.c printString.o -Wall -Werror -march=native

4. Correction des erreurs :

  • Si vous rencontrez des erreurs telles que "référence non définie à main.main", assurez-vous que vous disposez d'une fonction principale dans votre code C.
  • Si vous rencontrez des erreurs telles que "Impossible de trouver -lgo", vérifiez que la variable d'environnement LD_LIBRARY_PATH est définie pour pointer vers le dossier où se trouve libgo.so.

Solution alternative dans Go 1.5 :

Dans Go 1.5 (à venir en août), une nouvelle fonctionnalité permet la création de bibliothèques compatibles C à partir du code Go. Avec cette fonctionnalité, vous pouvez créer une bibliothèque statique ou partagée directement à partir d'un fichier Go, éliminant ainsi le besoin de fichiers objets intermédiaires.

Exemple :

  • Dans main.c :

    #include <stdio.h>
    
    int main()
    {
      char *string_to_pass = NULL;
      if (asprintf(&amp;string_to_pass, "This is a test.") < 0) {
          printf("asprintf fail");
          return -1;
      }
    
      PrintString(string_to_pass);
      return 0;
    }
  • Dans main.go (compilé avec go build -buildmode c-archive ... pour statique ou go build -buildmode c-shared . .. pour la bibliothèque partagée) :

    package main
    
    import "C"
    import "fmt"
    
    //export PrintString
    func PrintString(cs *C.char) {
      s := C.GoString(cs)
      fmt.Println(s)
    }
    
    func main() {}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn