Maison >développement back-end >Golang >Comment puis-je appeler des fonctions Go à partir d'un programme C à l'aide de « -buildmode=c-archive » de Go 1.5 ?

Comment puis-je appeler des fonctions Go à partir d'un programme C à l'aide de « -buildmode=c-archive » de Go 1.5 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-19 19:53:13640parcourir

How Can I Call Go Functions from a C Program Using Go 1.5's `-buildmode=c-archive`?

Appel de code Go à partir d'un programme C avec Go 1.5

Dans Go 1.5, la fonctionnalité -buildmode=c-archive a été introduite pour relier le code Go en non-Go environnements. Avec cette fonctionnalité, vous pouvez intégrer du code Go dans un projet C existant, vous permettant ainsi de déléguer des tâches de niveau supérieur au Go plus verbeux.

Exportation des fonctions Go pour l'invocation C

Pour créer Go fonctions disponibles pour le code C, vous devez les exporter explicitement à l'aide de commentaires spéciaux //export.

package main

import (
    "C"
    "fmt"
)

//export PrintInt
func PrintInt(x int) {
    fmt.Println(x)
}

func main() {}

Configuration du compilateur pour C Utilisation

La compilation du code Go en tant que bibliothèque appelable en C nécessite l'utilisation de l'indicateur -buildmode=c-archive.

go build -buildmode=c-archive foo.go

Cette commande génère une bibliothèque statique (foo.a) et un fichier d'en-tête (foo.h) contenant la déclaration de fonction exportée.

Intégration dans un projet C

Dans votre C projet, incluez le fichier d'en-tête généré et utilisez la fonction fournie comme suit :

#include "foo.h"

int main(int argc, char **argv) {
    PrintInt(42);
    return 0;
}

Compilation et exécution

Pour compiler le programme C, utilisez l'indicateur -pthread pour une prise en charge appropriée des threads.

gcc -pthread foo.c foo.a -o foo

L'exécution de l'exécutable imprimera désormais l'entier prévu (42) sur la console.

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