Wie integriere ich Go-Funktionen mit GCCGO in bestehende C-Projekte?

Linda Hamilton
Freigeben: 2024-10-26 22:42:02
Original
780 Leute haben es durchsucht

How to Integrate Go Functions into Existing C Projects Using GCCGO?

Go in vorhandenen C-Projekten verwenden

Hintergrund:
Sie haben ein C-Programm, das aus mehreren Objekten besteht Dateien, die in einer Archivdatei (.a) gespeichert sind. Sie beabsichtigen, dem Projekt eine neue Go-Datei hinzuzufügen, sie in eine Objektdatei zu kompilieren und in das vorhandene Archiv einzubinden.

Ziel:
Go-Funktionen in Ihr C integrieren Programm.

Prozess:

1. Kompilieren Sie die Go-Datei in eine Objektdatei:

  • Führen Sie den folgenden Befehl aus:

    gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native
    Nach dem Login kopieren

2. Rufen Sie Go-Funktionen von C auf:

  • Deklarieren Sie in Ihrer c_caller.c-Datei eine externe Funktion:

    extern int PrintString(char*) __asm__ ("print.main.PrintString");
    Nach dem Login kopieren
  • In der Hauptfunktion, rufen Sie die Go-Funktion auf und verarbeiten Sie das Ergebnis:

    int result = PrintString(string_to_pass);
    if (result) { printf("Everything went as expected!\n"); }
    else       { printf("Uh oh, something went wrong!\n"); }
    Nach dem Login kopieren

3. Mit GCCGO das gesamte Projekt erstellen:

  • Führen Sie den folgenden Befehl aus:

    gccgo -o main c_caller.c printString.o -Wall -Werror -march=native
    Nach dem Login kopieren

4. Fehler beheben:

  • Wenn Sie auf Fehler wie „undefinierter Verweis auf main.main“ stoßen, stellen Sie sicher, dass Ihr C-Code eine Hauptfunktion enthält.
  • Wenn Sie auf Fehler stoßen Fehler wie „cannot find -lgo“ vergewissern Sie sich, dass die Umgebungsvariable LD_LIBRARY_PATH so eingestellt ist, dass sie auf den Ordner zeigt, in dem sich libgo.so befindet.

Alternative Lösung in Go 1.5:

In Go 1.5 (erscheint im August) ermöglicht eine neue Funktion die Erstellung von C-kompatiblen Bibliotheken aus Go-Code. Mit dieser Funktion können Sie eine statische oder gemeinsam genutzte Bibliothek direkt aus einer Go-Datei erstellen, sodass keine Zwischenobjektdateien erforderlich sind.

Beispiel:

  • In main.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;
    }
    Nach dem Login kopieren
  • In main.go (kompiliert mit go build -buildmode c-archive ... für static oder go build -buildmode c-shared . .. für gemeinsam genutzte Bibliothek):

    package main
    
    import "C"
    import "fmt"
    
    //export PrintString
    func PrintString(cs *C.char) {
      s := C.GoString(cs)
      fmt.Println(s)
    }
    
    func main() {}
    Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie integriere ich Go-Funktionen mit GCCGO in bestehende C-Projekte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!