pkujhd / goloader

load and run golang code at runtime.
Apache License 2.0
506 stars 58 forks source link

似乎不支援泛型 #83

Closed patyhank closed 1 year ago

patyhank commented 1 year ago

已經有 goloader.RegTypes(symPtr, &maths.Vec3d[float64]{})

但還是會出現 unresolve external:maths.(*Vec3d[float64]).Add

Vec3d是這樣

type Vec3d[T constraints.Float] struct {
    X, Y, Z T
}

func (v Vec3d[T]) Add(vec3d Vec3d[T]) Vec3d[T] {
    return Vec3d[T]{X: v.X + vec3d.X, Y: v.Y + vec3d.Y, Z: v.Z + vec3d.Z}
}
func (v Vec3d[T]) Equals(vec3d Vec3d[T]) bool {
    return v.X == vec3d.X && v.Y == vec3d.Y && v.Z == vec3d.Z
}
pkujhd commented 1 year ago

@patyhank 给出你的测试环境,在darwin/amd64 golang1.20下未能复现你的错误

patyhank commented 1 year ago

linux/amd64 go 1.20.4

patyhank commented 1 year ago

有可能是間接使用泛型導致的嗎 因為我並沒有直接使用 maths.(*Vec3d[float64]).Add 直接在載入的檔案裡面使用似乎是可行的

pkujhd commented 1 year ago

在linux/amd64 golang 1.20中也无法复现你的问题

pkujhd commented 1 year ago

有可能是間接使用泛型導致的嗎 因為我並沒有直接使用 maths.(*Vec3d[float64]).Add 直接在載入的檔案裡面使用似乎是可行的

能否给出一个testcase

patyhank commented 1 year ago

稍等

patyhank commented 1 year ago

test.zip

pkujhd commented 1 year ago

这样注册不了,你需要加载rawtest/shared这个包的.a

goloader.RegTypes(symPtr, []int32{}, math.Floor) goloader.ReadObjs([]string{"test.o", "/Users/xxx/Library/Caches/go-build/c0/c0617fe178f43e9f56e030c7e5c9fb1a66418b1482c5bbf86a0ef78436a9233f-d"}, []string{"Test", "rawtest/shared"}) 修改成这样就可以了

具体的这个包的路径在importcfg中可以查询到

patyhank commented 1 year ago

這是泛型才需要這樣的嗎

pkujhd commented 1 year ago

這是泛型才需要這樣的嗎

不是,interface的也是如此

pkujhd commented 1 year ago

如果你有很多依赖在loader中不存在,建议使用https://github.com/eh-steve/goloader/tree/master 这个分支来处理

patyhank commented 1 year ago

好的謝謝