Maison >développement back-end >Golang >Comment intégrer des fonctions Go dans des projets C existants à l'aide de 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 :
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(&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!