在VC11中启用/禁用SAFESEH?

8
我为zlib 1.2.7创建了一个新的解决方案,将其设置为静态库,并从“./zlib/contrib/minizip”中添加了必要的头文件和源文件,成功编译。然后,我将其与libpng(也作为静态库)链接,也编译成功。接着,我将libpng链接到我的图形引擎项目(也是静态库)...仍然没有错误。
但是,一旦我将主项目链接到我的图形引擎,就会出现几个LNK2026错误,涉及crc32.obj、deflate.obj、inflate.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个回答

16
通过在连接器标志中添加/SAFESH:NO
嗯,你拼错了。也许是在问题中,也可能是在连接器设置中,这种巧合往往可以解释为什么本应该工作的东西不起作用。
可以在不输入它的情况下使用。项目+属性,连接器,高级,向右滚动面板,"图像具有安全异常处理程序" 设置。使用组合框选择“否”。

那是一个打字错误。在所有项目中,它的正确拼写为/SAFESEH。 唯一有这个设置的项目是我的主项目(其他项目中是“Librarian”而不是“Linker”,并且在“Librarian->“所有选项”下不存在该选项)。 我在我的主项目中将其更改为“NO”,并且编译和运行时没有任何错误...但我宁愿在更深层次上支持它以支持我的静态库,这样第三方开发人员就不会被迫在自己的项目中禁用它。这可能吗? - RectangleEquals
当然,重新构建您使用的所有 .libs。 - Hans Passant
Zlib、libpng和我的引擎是我使用的唯一几个(除了d3d9.lib和d3dx9.lib,当然这是闭源的)……就像我说的,它们中没有一个叫做“图像具有安全异常处理程序”的设置。因此,重新构建它们并不能解决任何问题。如果可以解决,我会知道的,因为在重新构建我的主项目之前,我总是重新构建它们。所以,如果我想要一个真正的解决方案,我只能回到原点,或者强制其他开发人员在他们的项目中禁用该选项。 - RectangleEquals
Hans Passant的解决方案是正确的。我有完全相同的症状,果然,我写成了/safesh而不是/safeseh - Björn Lindqvist
@RectangleEquals 你能解决这个问题吗?我也遇到了同样的情况。我已经检查了库中 /SAFESEH 的拼写,一切看起来都很好,但仍然和你一样面临相同的问题。 - sonu gupta

2

快速谷歌搜索显示,这表明您需要使用适当的编译器设置重新编译有问题的模块。

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

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

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

如果您提供编译器的版本号以及zlib的构建方式(是否自己构建,并且使用相同的编译器),将会很有帮助。


我的问题的第一句话表明我确实在新解决方案中自己构建了它,标题和标签表明我正在使用vc11。所有内容都是使用相同的编译器版本完成的。我忘记提到所有项目都设置为x86,所以我会更新我的问题。 - RectangleEquals
另外,您是否使用/SAFESEH选项设置链接了zlib? - Nathan Ernst
1
是的,在发布问题之前我已经尝试过了。 所有项目都给我同样的错误集。 就好像/SAFESEH在我的链接器中不再存在一样,尽管它说它存在。 - RectangleEquals

0
在Visual Studio 2017中, 右键单击项目 -> 属性 -> 配置属性 -> 链接器 -> 所有选项 -> 图像具有安全异常处理程序 = 否 (/SAFESEH:NO) 输入图像描述

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