Auch wenn ich die gleiche C-Headerdatei in 2 verschiedene go-Dateien einfüge, erhalte ich einen Fehler Der Compiler denkt, dass die Typen unterschiedlich sind. Ich hatte ursprünglich den Header systemweit (mit <>
ohne Pfadangabe) enthalten, aber das hat auch nicht funktioniert.
Variable vom Typ C.struct_Foo kann nicht als Typ package.C.struct_Foo verwendet werden, wenn "C" in zwei Dateien importiert wird
// main.go
package main
import (
"fmt"
"github.com/john-difool/test/lib"
)
//#include "lib/types.h"
import "C"
func main() {
var p C.Point
p.x = 0
p.y = 0
fmt.Println(lib.CheckPoint(p))
}
// lib/lib.go
package lib
//#include "types.h"
import "C"
func CheckPoint(pt C.Point) bool {
return true // TOnotDO
}
// lib/types.h
typedef struct Point {
float x;
float y;
} Point;
Dies ist der Fehler, den ich tue go build
auf der obersten Ebene erhalten:
kann nicht p (Typ C.struct_Point) als Typ lib.C.struct_Point in Argument
Dies ist Standardverhalten. Die Typen sind nicht identisch, da sie in zwei verschiedenen Go-Paketen importiert werden. –
Das klingt nach einer ziemlich großen Einschränkung. Was ist, wenn ich einige C-Typen in mehreren Dateien verwenden muss? Was ist Ihre Empfehlung, damit dies funktioniert? – Laurent
Sie würden 'C.Point' aus' lib' als neuen Typ exportieren: 'type Point C.Point' und' lib's Funktionen, um diesen Typ zu akzeptieren. Dies erfordert jedoch, dass Ihre C-Strukturen Feldnamen exportiert haben (d. H. Mit einem Großbuchstaben beginnen). Wenn dies nicht der Fall ist, müssen Sie Wrapper-Go-Strukturen erstellen, die Informationen in und aus der C-Struktur kopieren. –