8

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

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

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

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

4

3 回答 3

16

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

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

无需输入即可使用,请务必这样做。Project + Properties,Linker,Advanced,向下滚动右侧面板,“Image has Safe Exception Handlers”设置。使用组合框选择否。

于 2013-04-13T02:07:56.270 回答
2

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

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

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

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

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

于 2013-04-13T00:28:03.823 回答
0

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

于 2018-06-04T10:21:06.113 回答