Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-26 22:42:02
original
780 Les gens l'ont consulté

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
    Copier après la connexion

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");
    Copier après la connexion
  • 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"); }
    Copier après la connexion

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
    Copier après la connexion

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;
    }
    Copier après la connexion
  • 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() {}
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!