模块对SAFESEH映像C ++不安全


87

我正在使用Microsoft Visual Studio 2011 Professional Beta

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

但是,当我去调试项目时,我遇到600多个错误,其中大多数是:

错误LNK2026:对于SAFESEH映像,模块不安全。

这些文件显然在opencv_ffmpeg项目中,但是我找不到它们,我已经查看了Microsoft帮助页面上的safeseh安全异常处理程序页面,但是找不到任何明确的答案。

我想知道是否还有其他人有这个问题,他们是否设法解决了。


12
当您链接包含编译器早期版本创建的代码的.obj或.lib时,会发生这种情况。如果您下载了opencv_ffmpeg的二进制文件而不是源代码,那么哪个当然很常见。您可以关闭链接器选项,但仍然会出现CRT版本不兼容的情况,并且可能会字节化。从源重建库。
汉斯·帕桑

感谢您的帮助,它奏效了
亚伦汤普森

@HansPassant没有源时该怎么办?
GregC 2012年

4
显而易见的事情:请代码所有者为您提供更新。
汉斯·帕桑

@HansPassant我希望供应商仍在进行更新。听起来像是“一个卡车因素”这类问题。
GregC 2012年

Answers:


63

从评论:

当您链接包含编译器早期版本创建的代码的.obj或.lib时,会发生这种情况。如果您下载了opencv_ffmpeg的二进制文件而不是源代码,那么哪个当然很常见。您可以关闭链接器选项,但仍然会出现CRT版本不兼容的情况,并且可能会字节化。从源重建库。–汉斯·帕桑(Hans Passant)5月15日下午13:01  
 
感谢您的帮助,它奏效了–亚伦·汤普森5月17日下午14:50


它也可能由链接器无法找到安全异常处理程序的模块(作为错误状态)引起。特别是汇编语言模块-如其他答案所述。有关于这一些信息在这里
尼克·韦斯特盖特

148

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


3
这对我没有影响。
Pop-A-Stash

对我来说也一样。尽管我可以在链接器设置下的“高级选项”子菜单中选择“ SAFESEH:NO”,但似乎并没有保持选中状态。它总是恢复为SAFESEH:YES。
user382459 '16

VS 2013 Express获得成功
gbarry

1
成功,VS 2015

2
成功,2017年
ke4ktz,

12

如果在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é马兰

11

另一种方法是将一些SEH处理程序(例如为空)添加到asm文件中/safeseh,然后使用option对其进行编译,然后通常使用/SAFESEH:YESeditor选项来编译其他代码。

空的SEH处理程序:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp

1
我似乎没有费心将处理程序添加到第三方源代码(zlib)中/safeseh。这真的应该被赞成!
mlt 2015年

2
任何与zlib有相同问题的人都可以看到此(CTRL + F safeseh)tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy

我已经在.asm文件的属性中的命令行中添加了“ / safeseh”,并且可以正常工作。
诺伯特·博罗斯

0

您的工作量可能会有所不同,但是以上建议对我都不起作用(尽管我没有尝试滚动自己的asm异常处理程序)。

起作用的是选择构建目标版本/ x64。

我正在64位计算机上运行Windows 10,并使用Visual Studio 2015。

目标Release / Win32也可以。我想最主要的是选择“发布”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.