C++中的模块对于SAFESEH图像是不安全的

94

我正在使用Microsoft Visual Studio 2011专业版beta。

我正在尝试运行使用cMake和Visual Studio编译器编译的OpenCV C++文件(http://opencv.willowgarage.com/wiki/Welcome)。

但是当我尝试调试项目时,我收到了600多个错误,其中大部分是:

error LNK2026: module unsafe for SAFESEH image.

显然,这些文件在opencv_ffmpeg项目中,但我找不到它们,我查看了Microsoft帮助页面上关于safeseh Safe Exception Handlers页,但没有找到明确的答案。

我想知道是否有其他人遇到过这个问题,并且他们是否成功解决了它。


12
如果你链接了一个含有早期编译器创建的代码的 .obj 或 .lib,就会出现这种情况。如果你下载了 opencv_ffmpeg 的二进制文件而非源代码,这种情况当然很常见。你可以关闭链接选项,但这样仍然会存在 CRT 版本不兼容性问题,可能会导致错误。建议重新从源代码构建库。 - Hans Passant
@HansPassant 当没有源代码时该怎么办? - GregC
4
显而易见的事情:向代码所有者请求更新。 - Hans Passant
@HansPassant,我希望供应商还在,能够进行更新。听起来像是一个“卡车因素为一”的问题。 - GregC
@HansPassant 我有一个项目的源代码,但是所有者已经离开了。在我的情况下,所有者消失了,没有人知道他的去向。我正在考虑将该项目更新到VS2012。也许你知道如何更新代码,对吗?如果不知道,我应该咨询谁?谢谢。 - tom_mai78101
5个回答

162

在项目属性 -> 配置属性 -> 链接器 -> 高级选项卡中禁用“图像具有安全异常处理程序”选项有所帮助。


4
对我来说,这没有任何影响。 - Pop-A-Stash
1
成功,使用VS 2013 Express。 - gbarry
2
成功,VS 2015 - user707779
1
成功,VS 2012 - themadmax
4
成功,VS 2017。 - ke4ktz
显示剩余3条评论

65

根据评论:

当您链接包含较早版本编译器创建的代码的.obj或.lib文件时,会出现此问题。如果您下载了opencv_ffmpeg的二进制文件而不是源代码,则这种情况很常见。您可以关闭链接器选项,但是仍然会存在CRT版本不兼容性问题。从源代码重新构建库。 – Hans Passant May 15 at 13:01  
 
感谢帮助,它起作用了 – Aaron Thompson May 17 at 14:50


正如错误所述,这也可能是由于链接器找不到安全异常处理程序的模块引起的。特别是汇编语言模块 - 如其他答案中所讨论的那样。关于此问题有一些信息,请参见此处 - Nick Westgate

17
如果您在使用Visual Studio构建ZLIB时遇到此错误,请按照以下解决方案操作。查找contrib\masmx86\bld_ml32.bat并将/safeseh添加为选项。

修改前

ml /coff /Zi /c /Flmatch686.lst match686.asm
ml /coff /Zi /c /Flinffas32.lst inffas32.asm

之后

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm

我在使用zlib时也遇到了同样的问题,但是不得不在解决方案资源管理器中更改.asm文件的属性。 - Cillié Malan
类似地,使用 win32\Makefile.msc,将 -safeseh 添加到 ASFLAGS 中。 - bonger

13

另一种方法是在asm文件中添加一些SEH handler(例如空的),并使用/safeseh选项编译它们,然后使用/SAFESEH:YES编译器选项正常编译其他代码。

空的SEH处理程序:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
我没有费心为第三方源(zlib)添加处理程序,/safeseh 看起来已经足够了。这真的应该得到赞同! - mlt
2
有遇到 zlib 相关问题的人可以看一下这个链接(CTRL + F safeseh)http://www.tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall/ - codekiddy
我已经在.asm文件的属性中的命令行中添加了"/safeseh",这样就可以正常工作了。 - Mecanik
虽然这不是对问题的真正回答,但这个答案对我很有帮助。重要的是在同一目录中使用bat文件重新构建obj文件。 - flexw

0

你的结果可能会有所不同,但以上建议都没有对我起作用(尽管我没有尝试自己编写asm异常处理程序)。

有效的方法是选择构建目标Release/x64。

我在一台64位机器上运行Windows 10,并使用Visual Studio 2015。

Release/Win32目标也可以工作。我想关键是选择“Release”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接