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

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

DDD
Libérer: 2024-10-26 16:21:02
original
413 Les gens l'ont consulté

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

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

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

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

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

Construire en tant que bibliothèque statique :

go build -buildmode c-archive -o mygopkg.a
gcc -o main _main.c mygopkg.a -lpthread
Copier après la connexion

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
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
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!