在什么情况下 Go 会在调用dll时出现“信号在 cgo 执行期间到达”之类的恐慌?要调用的代码是 - 基于zsyscall_windows.goin srcof go 分布中的样本:var ( // entry names found using dumpbin /exports dllSweph = syscall.NewLazyDLL("swedll32.dll") _swe_jdut1_to_utc = dllSweph.NewProc("_swe_jdut1_to_utc@36") _swe_julday = dllSweph.NewProc("_swe_julday@24"))func swe_julday(year, month, day int32, hour float64, gregflag int32) float64 { r, _, errn := syscall.Syscall6( _swe_julday.Addr(), 5, uintptr(year), uintptr(month), uintptr(day), uintptr(hour), uintptr(gregflag), 0) if r == 0 { if errn != 0 { panic(error(errn)) } } return float64(r)}func swe_jdut1_to_utc(tjd_ut float64, gregflag int32, iyear, imonth, iday, ihour, imin *int32, dsec *float64) { defer func() { if e := recover(); e != nil { } }() syscall.Syscall9( _swe_jdut1_to_utc.Addr(), 8, uintptr(tjd_ut), uintptr(gregflag), uintptr(unsafe.Pointer(iyear)), uintptr(unsafe.Pointer(imonth)), uintptr(unsafe.Pointer(iday)), uintptr(unsafe.Pointer(ihour)), uintptr(unsafe.Pointer(imin)), uintptr(unsafe.Pointer(dsec)), 0)}现在当我打电话时swe_julday一切似乎都很好;虽然它不是,它给出了错误的答案。当swe_jdut1_to_utc被调用时,我得到:Exception 0xc0000005 0x1 0x42e5e5 0x3235ce40PC=0x3235ce40signal arrived during cgo execution.../sweph.swe_jdut1_to_utc(0x40000000, 0x4150b979, 0x1, 0x1207bf24, 0x1207bf28, 0x1207bf34, 0x1207bf30, 0x1207bf2c, 0x1207bf38)...(trace info)eax 0x0ebx 0x1207be94ecx 0x1207bf38edx 0x42e5e5edi 0xcfeacesi 0x0ebp 0xcfe5cesp 0xcfdd8eip 0x3235ce40eflags 0x10246cs 0x23fs 0x53gs 0x2bexit status 2exit status 1环境:Windows 8 x64go 1.4 x86gcc x86而且我不知道是否gcc真的需要只调用一个 dll,但我已经以任何方式安装了它,因为错误是关于cgo. 所有命令都在路径中。使用管理权限编译时出现同样的错误。
1 回答
拉风的咖菲猫
TA贡献1995条经验 获得超2个赞
我设法构建了使用 swe_julday 函数的 delphi 应用程序。不幸的是,我可以看到它使用 fstp asm 指令来检索 swe_julday 返回的结果。Go 的 syscall.Syscall 不支持此功能。你是我们的幸运儿。如果可以使用 mingw 编译器构建您的库,我认为您最好的选择是使用 CGO。对不起
- 1 回答
- 0 关注
- 407 浏览
添加回答
举报
0/150
提交
取消