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:
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(&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!