Seit Go 1.5 herauskam, habe ich angefangen, mich erneut damit zu beschäftigen, wie ich es in ein bestehendes Projekt von mir integrieren könnte.
Die Codebasis des Projekts ist vollständig in C geschrieben, um einen Low-Level-Zugriff auf Hardware und andere lustige Dinge zu ermöglichen. Einige der Dinge auf höherer Ebene sind jedoch langweilig, und ich würde gerne anfangen, sie in einer Sprache auf höherer Ebene zu schreiben (Go).
Gibt es eine Möglichkeit, Go-Code von einem C-Programm aus aufzurufen? Ich habe Go 1.5 installiert, was hinzugefügt wurde -buildmode=c-archive
(https://golang.org/s/execmodes), die ich versuche zum Laufen zu bringen.
Ich kann Go jedoch anscheinend nicht dazu bringen, die entsprechenden Header-Dateien zu generieren, damit mein Projekt tatsächlich kompiliert werden kann. Wenn ich das Archiv generiere, sehe ich die Funktion in den exportierten Symbolen (mit objdump), aber ohne die Header-Dateien zum Einbinden von gcc beschwert sich, dass die Funktion nicht vorhanden ist (wie erwartet).
Ich bin ziemlich neu in Go, aber ich liebe die Sprache und würde sie gerne nutzen. Gibt es einen idiomatischen Weg (“idiomatisch” wird in der Welt von Go, wie ich sehe, oft verwendet …), um dies dazu zu bringen, gut miteinander zu spielen?
Der Grund, warum ich diese Frage gestellt und Go 1.5 ausdrücklich erwähnt habe, ist, dass laut diesem Dokument https://docs.google.com/document/d/1nr-TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ/edit?pli=1#heading=h.1gw5ytjfcoke
Go 1.5 fügte Unterstützung für Nicht-Go-Programme hinzu, um Go-Code aufzurufen. Insbesondere erwähnt im Abschnitt „Go-Code, der mit einem Nicht-Go-Programm verknüpft ist und von einem Nicht-Go-Programm aufgerufen wird“
Exportierst du über cgo? Das Dokument, auf das Sie verlinken, sagt: „Die einzigen aufrufbaren Symbole sind diejenigen, die als exportiert markiert sind (von jedem Paket), wie in beschrieben cgo-Dokumentation.” Dieser Link zur cgo-Dokumentation erwähnt eine generierte
_cgo_export.h
.– David C
25. August 2015 um 23:53 Uhr
Eine frühere Frage sagte, die Antwort sei nein. Ich wäre neugierig, ob sich in 1.5 etwas geändert hat, aber ich bezweifle es: stackoverflow.com/questions/6125683/call-go-functions-from-c
– Gabriel Süd
25. August 2015 um 23:55 Uhr
Der Grund, warum ich Go 1.5 erwähnt habe, war, dass dieses Dokument ausdrücklich die Möglichkeit erwähnt, gemeinsam genutzte Objektdateien oder Archivdateien zu erstellen, die von Systemen aufgerufen werden können, die keinen Go-Code erwarten , ein Nicht-Go-Programm” in diesem Link docs.google.com/document/d/…
– fürchterlich
26. August 2015 um 1:07 Uhr
Dave C ist auf der Spur–blog.filippo.io/building-python-modules-with-go-1-5 hat mehr (im Zusammenhang mit der Verbindung von Go mit Python über
c-shared
archivieren ucgo
Exporte), aber ich habe jetzt nicht die Zeit, das zu einer zusammenhängenden Antwort zusammenzufügen. Es scheint jedoch, dass Sie Go jetzt von C aus verwenden können.– zweizweizwei
26. August 2015 um 1:47 Uhr
Ich habe cgo erwähnt nicht als Möglichkeit, mit C-Code zu interagieren, aber so, wie Sie es brauchen Kennzeichen welche Funktionen exportiert und von C aufgerufen werden sollen (im Grunde nur eine
//export …
Kommentar). Wie in meinem Kommentar erwähnt, wird dies in dem genau verlinkten Dokument beschrieben.– David C
26. August 2015 um 17:21 Uhr