Heim  >  Artikel  >  Backend-Entwicklung  >  Wie integriere ich Go-Funktionen mit GCCGO in bestehende C-Projekte?

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

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 22:42:02765Durchsuche

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

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");
  • 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"); }

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

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;
    }
  • 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() {}

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!

Stellungnahme:
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