![](/img/trans.png)
[英]fatal error: sys/socket.h: No such file or directory, x86_64-w64-mingw32 mode
[英]setjmp/longjmp in x86_64-w64-mingw32
不久前,已知mingw-w64中的setjmp / longjmp被打破了( http://www.agardner.me/golang/windows/cgo/64-bit/setjmp/longjmp/2016/02/29/go-windows- setjmp-x86.html )。
我们有一个遗留代码,我们曾经在32位Linux和32位Windows上运行,这些代码(仍然)运行良好。 64位Linux版本也可以正常工作,但是在第一个longjmp返回setjmp位置后,64位Windows版本会崩溃。
我在msvcrt!_setjmpex,msvcrt!RtlUnwindEx中出现段错误。
我已经研究了代码,最初我注意到在我们的代码中C(99/11)标准没有违反为setjmp / longjmp定义的规则。 上述解决方法(“使用gcc内置函数”)对我也不起作用。
我在创建最小的可复制示例时遇到了麻烦。 示例作品。 完整的代码没有。 当然,我可以开始从完整的源代码中删除功能,但这不是一个简单的任务。
因此,这里的问题基本上是,(仍然)已知的mingw-w64中的setjmp / longjmp是否被破坏了?
是的,对于使用x86_64-w64-mingw32编译器编译的某些代码,setjmp / longjmp仍然无法正常工作。 它适用于更简单的测试用例,我尝试重现一个问题。 所以,如果你碰到这样的longjmp / setjmp的问题,尝试使用__builtin_setjmp,而是__builtin_longjmp(如解释在这里 )。
我的错误是重新定义了longjmp / setjmp宏,因此我可以通过简单的define选择要使用的版本,但是却到处都找不到。 这导致编译的程序同时使用不兼容的内置版本和库版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.