Maison >développement back-end >Golang >Comment puis-je appeler des fonctions Go à partir de mon programme C à l'aide de GCCGO ?
Appel de fonctions Go à partir d'un programme C à l'aide de GCCGO
Introduction
Pour intégrer le code Go au sein d'un projet C existant, il faut créer un fichier objet (.o) à partir du fichier Go et l'incorporer dans le fichier d'archive (.a) du projet C. Cet article fournit une explication détaillée sur la façon d'y parvenir à l'aide de GCCGO.
Créer un fichier objet Go
Pour créer un fichier objet à partir d'un fichier Go, utilisez gccgo commande avec l'option -c pour compiler le fichier sans le lier :
gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native
L'option -fgo-prefix spécifie un préfixe pour les symboles exportés depuis le fichier Go.
Lier la fonction Go au programme C
Pour lier le fichier objet Go au programme C, utilisez les déclarations extern et le mot-clé __asm__ dans le code C :
<code class="c">#include <stdio.h> extern int PrintString(char*) __asm__ ("print.main.PrintString");</code>
Ce déclare la fonction PrintString avec la signature correcte et le nom du symbole pour GCCGO.
Compilation
Pour compiler le programme C avec le fichier objet Go, utilisez gccgo avec le -o option pour spécifier l'exécutable de sortie :
gccgo -o main c_caller.c printString.o -Wall -Werror -march=native
Résolution des erreurs de compilation
L'erreur de compilation initiale mentionnée dans la question d'origine indique que GCCGO attend une fonction principale dans le Go déposer. Cependant, cela n'est pas obligatoire lors de la liaison à un programme C. Pour résoudre ce problème, assurez-vous que :
Options supplémentaires
Pour résoudre les erreurs de l'éditeur de liens liées aux références de bibliothèque manquantes, essayez les options suivantes :
Exemple de Go 1.5 (août 2015)
Go 1.5 a introduit la possibilité de créer des bibliothèques compatibles C directement en utilisant le aller outil. Cette méthode simplifie considérablement le processus :
_main.c
<code class="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; }</code>
main.go
<code class="go">package main import "C" import "fmt" //export PrintString func PrintString(cs *C.char) { s := C.GoString(cs) fmt.Println(s) } func main() {}</code>
Construire en tant que bibliothèque statique :
go build -buildmode c-archive -o mygopkg.a gcc -o main _main.c mygopkg.a -lpthread
Construire en tant que bibliothèque partagée :
go build -buildmode c-shared -o mygopkg.so LD_RUN_PATH=$(pwd) gcc -o main _main.c mygopkg.so -lpthread
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!