Maison >développement back-end >Golang >Comment puis-je appeler des fonctions Go à partir de mon programme C à l'aide de GCCGO ?

Comment puis-je appeler des fonctions Go à partir de mon programme C à l'aide de GCCGO ?

DDD
DDDoriginal
2024-10-26 16:21:02516parcourir

How can I Call Go Functions from My C Program Using 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 :

  • Le fichier Go ne contient pas de fonction principale.
  • Le programme C définit sa propre fonction principale.

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 :

  • --static-libgo : Utiliser la version statique de la bibliothèque Go.
  • -static : lien vers des bibliothèques statiques au lieu de bibliothèques partagées.
  • -Wl,-R,/path/to/libgo.so's_folder : spécifiez le chemin vers le dossier contenant libgo.so.

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(&amp;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!

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