Wie kann ich mit GCCGO Go-Funktionen aus meinem C-Programm aufrufen?

DDD
Freigeben: 2024-10-26 16:21:02
Original
413 Leute haben es durchsucht

How can I Call Go Functions from My C Program Using GCCGO?

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
Nach dem Login kopieren

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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:

  • Die Go-Datei keine Hauptfunktion enthält.
  • Das C-Programm definiert seine eigene Hauptfunktion.

Zusätzliche Optionen

Um die Linker-Fehler im Zusammenhang mit fehlenden Bibliotheksverweisen zu beheben, versuchen Sie die folgenden Optionen:

  • --static-libgo: Verwenden Sie die statische Version der Go-Bibliothek.
  • -static: Link zu statischen Bibliotheken anstelle von gemeinsam genutzten Bibliotheken.
  • -Wl,-R,/path/to/libgo.so's_folder: Geben Sie den Pfad an der Ordner, der libgo.so enthält.

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(&amp;string_to_pass, "This is a test.") < 0) {
        printf("asprintf fail");
        return -1;
    }

    PrintString(string_to_pass);
    return 0;
}</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Gebäude als statische Bibliothek:

go build -buildmode c-archive -o mygopkg.a
gcc -o main _main.c mygopkg.a -lpthread
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

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
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!