在VC11中启用/禁用SAFESEH?

时间:2013-04-13 00:19:40

标签: c++ visual-c++ exception-handling linker linker-errors

我为zlib 1.2.7创建了一个新的解决方案,将其设置为静态库,从./zlib/contrib/minizip添加了必要的头文件和源文件,并使其编译得很好。然后我将它与libpng(也作为一个静态库)链接,它也编译好。然后,我将libpng链接到我的图形引擎项目(也是一个静态库)......仍然没有错误。

但是一旦我将主项目链接到我的图形引擎,我就会收到几个关于 crc32.obj deflate.obj inflate的LNK2026错误。 obj d3dxplane.obj d3dxvec4.obj 和其他zlib / directx相关模块。它告诉我它们来自我的图形引擎库,所以我决定通过将/SAFESEH:NO添加到相应项目的链接器标志来解决这个问题。
注意:我应该声明所有项目都设置为目标x86,而不是x64。

然而,问题是,现在我得到了:
warning LNK4044: unrecognized option '/SAFESEH'; ignored导致我的主项目中出现相同的LINK2026错误 如果我打开visual studio命令提示符并键入LINK /?,则确认/SAFESEH是一个有效的链接器选项。当我使用/SAFESEH (没有':NO')时,我得到同样的错误,如果我完全省略它,那么我的主项目就是拒绝构建。

这里发生了什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:15)

  

通过向我的链接器标志添加/ SAFESH:NO

好吧,你拼错了。也许在您的问题中,也许在链接器设置中,这种巧合往往可以解释为什么应该起作用的东西不起作用。

无需输入即可使用,请按此方式进行操作。项目+属性,链接器,高级,向下滚动右侧面板,“图像具有安全异常处理程序”设置。使用组合框选择编号

答案 1 :(得分:1)

快速google shows表示您需要使用适当的编译器设置重新编译有问题的模块。

请注意,此标志仅适用于x86目标。如果您的目标是64位,则无论如何都会出现此错误。

此外,来自http://msdn.microsoft.com/en-us/library/9a89h429(v=vs.80).aspx,可能是相关的:

  

链接器无法生成的最常见原因   图像是因为一个或多个输入文件(模块)来的   链接器与安全异常处理程序功能不兼容。一个   模块与安全异常不兼容的常见原因   处理程序是因为它是使用前一个编译器创建的   Visual C ++版本。

如果您提供编译器的版本号以及如何构建zlib的副本(您是自己构建它,如果是这样,使用相同的编译器吗?)将会有所帮助。

答案 2 :(得分:0)

在Visual Studio 2017中 右键单击Project - >属性 - >配置属性 - >链接器 - >所有选项 - > 图像具有安全异常处理程序=否(/ SAFESEH:否) enter image description here