即使我将相同的 C头文件包含在2个不同的go文件中,我也会收到错误,因为编译器认为类型不同。我最初在系统范围内包含了标题(使用<>
而没有路径位置),但这也没有用。
// 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;
这是我在顶级go build
处理的错误:
不能使用p(类型C.struct_Point)作为类型lib.C.struct_Point lib.CheckPoint的参数
答案 0 :(得分:1)
编辑:小写C标题:
你需要定义新的Setter方法和
像这样从lib导出点,它会起作用:
工作样本:
lib.go文件:
package lib
/*
typedef struct{
float x;
float y;
} point_t;
*/
import "C"
type Point C.point_t
func (p *Point) SetX(x float32) {
p.x = C.float(x)
}
func (p *Point) SetY(y float32) {
p.y = C.float(y)
}
func CheckPoint(pt Point) bool {
return pt.x == 1 && pt.y == 2
}
main.go文件:
package main
import (
"fmt"
"github.com/john-difool/test/lib"
)
func main() {
var p lib.Point
p.SetX(1)
p.SetY(2)
fmt.Println(lib.CheckPoint(p)) //true
}
旧:
像这样从lib导出点,它会起作用:
工作样本:
lib.go文件:
package lib
/*
typedef struct{
float X;
float Y;
} Point_t;
*/
import "C"
type Point C.Point_t
func CheckPoint(pt Point) bool {
return pt.X == 1 && pt.Y == 2
}
main.go文件:
package main
import (
"fmt"
"github.com/john-difool/test/lib"
)
func main() {
var p lib.Point
p.X = 1
p.Y = 2
fmt.Println(lib.CheckPoint(p)) //true
}