Heim >Backend-Entwicklung >Golang >Wie kann ich mit GCCGO Go-Funktionen aus meinem C-Programm aufrufen?
Aufrufen von Go-Funktionen aus einem C-Programm mit GCCGO
Einführung
Um Go-Code zu integrieren Innerhalb eines bestehenden C-Projekts muss man eine Objektdatei (.o) aus der Go-Datei erstellen und diese in die Archivdatei (.a) des C-Projekts integrieren. Dieser Artikel enthält eine detaillierte Erklärung, wie Sie dies mit GCCGO erreichen.
Erstellen einer Go-Objektdatei
Um eine Objektdatei aus einer Go-Datei zu erstellen, verwenden Sie gccgo Befehl mit der Option -c, um die Datei zu kompilieren, ohne sie zu verknüpfen:
gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native
Die Option -fgo-prefix gibt ein Präfix für die aus der Go-Datei exportierten Symbole an.
Verknüpfen der Go-Funktion mit dem C-Programm
Um die Go-Objektdatei mit dem C-Programm zu verknüpfen, verwenden Sie externe Deklarationen und das Schlüsselwort __asm__ im C-Code:
<code class="c">#include <stdio.h> extern int PrintString(char*) __asm__ ("print.main.PrintString");</code>
Dies deklariert die PrintString-Funktion mit der richtigen Signatur und dem richtigen Symbolnamen für GCCGO.
Kompilierung
Um das C-Programm mit der Go-Objektdatei zu kompilieren, verwenden Sie gccgo mit dem -o Option zum Angeben der ausführbaren Ausgabedatei:
gccgo -o main c_caller.c printString.o -Wall -Werror -march=native
Kompilierungsfehler beheben
Der in der ursprünglichen Frage erwähnte anfängliche Kompilierungsfehler weist darauf hin, dass GCCGO eine Hauptfunktion im Go erwartet Datei. Bei der Verknüpfung mit einem C-Programm ist dies jedoch nicht erforderlich. Um dieses Problem zu beheben, stellen Sie sicher, dass:
Zusätzliche Optionen
Um die Linker-Fehler im Zusammenhang mit fehlenden Bibliotheksverweisen zu beheben, versuchen Sie die folgenden Optionen:
Beispiel aus Go 1.5 (August 2015)
Go 1.5 führte die Möglichkeit ein, C-kompatible Bibliotheken direkt mit zu erstellen Geh Werkzeug. Diese Methode vereinfacht den Prozess erheblich:
_main.c
<code class="c">#include <stdio.h> int main() { char *string_to_pass = NULL; if (asprintf(&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>
Gebäude als statische Bibliothek:
go build -buildmode c-archive -o mygopkg.a gcc -o main _main.c mygopkg.a -lpthread
Gebäude als gemeinsam genutzte Bibliothek:
go build -buildmode c-shared -o mygopkg.so LD_RUN_PATH=$(pwd) gcc -o main _main.c mygopkg.so -lpthread
Das obige ist der detaillierte Inhalt vonWie kann ich mit GCCGO Go-Funktionen aus meinem C-Programm aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!