运行mingw32-make编译OpenCV3.4.1时遇.seh_savexmm无效寄存器错误求助
解决MinGW32-make编译OpenCV 3.4.1时的
.seh_savexmm汇编错误 这个问题我碰到过好多次,本质是MinGW GCC版本与OpenCV 3.4.1的SEH(结构化异常处理)指令生成逻辑不兼容导致的。下面是几个亲测有效的解决办法,按优先级排序:
方法1:降级MinGW GCC版本
OpenCV 3.4.1是2018年的老版本,新的MinGW GCC(比如9.x及以上版本)在生成SEH相关汇编指令时,使用的寄存器规则和旧版OpenCV的代码不匹配,才会抛出“无效寄存器”的错误。
建议你切换到GCC 7.x或8.x版本的MinGW-W64(比如7.3.0版本),这个版本和OpenCV 3.4.1的兼容性拉满,基本不会出现这类汇编层面的问题。
方法2:禁用SEH编译(无需换编译器)
如果不想折腾换编译器,可以在CMake配置阶段强制关闭SEH,改用SJ异常处理:
- 如果你用CMake GUI:在
CMAKE_C_FLAGS和CMAKE_CXX_FLAGS里分别添加-fno-seh - 如果你用命令行CMake:直接加上参数:
cmake -D CMAKE_C_FLAGS="-fno-seh" -D CMAKE_CXX_FLAGS="-fno-seh" [你的OpenCV源码路径]
另外,也可以尝试关闭SSE优化(虽然可能会损失一点性能,但能快速解决问题):
cmake -D ENABLE_SSE=OFF [你的OpenCV源码路径]
配置完成后,清空之前的build目录,重新运行mingw32-make即可。
方法3:修改OpenCV源码(进阶方案)
如果上面两个方法都不行,你可以定位到报错的汇编对应的C++代码(一般是在OpenCV的SSE优化模块里),找到生成.seh_savexmm指令的代码段,注释掉或者替换成MinGW兼容的写法。不过这个方法需要你有一定的汇编和源码阅读能力,所以只推荐给有经验的开发者。
内容的提问来源于stack exchange,提问作者Campigone
相关产品推荐
相关产品推荐

