Fra*_*ler 1 c++ access-violation first-chance-exception libpng visual-studio-2012
我的是win7 64位家庭版。我的所有项目都设置为使用 C++ 在 32 位环境中构建。我已经使用 MDd 运行时在调试模式下成功构建了 libpng。我有两个正在进行的项目。我的第一个项目是在 VS2010 中,第二个项目是在 VS2012 中。在我的计算机中,我创建了一个环境变量,设置为该库的路径,以使我的项目中的链接更容易。我的两个项目都使用 MDd 以及多字节,这与 libpng 使用的相同。我的所有路径和依赖项都是正确的。我还将 libpng16.dll 复制到两个项目中与其构建的可执行文件位于同一目录中。我可以成功编译和构建这两个项目。我的 VS2010 项目运行并渲染加载的 PNG 图形,但我在 VS2012 中的项目却不能。当我调用 png_read_png 抛出和未处理的异常时,它崩溃了:
check = fread( data, 1, length, png_voidcast( png_FILE_p, png_ptr->io_ptr ) );
Run Code Online (Sandbox Code Playgroud)
在 pngrio.c 内。给出这个错误:
First-chance exception at 0x77308E19 (ntdll.dll) in Game_debug.exe: 0xC0000005:
Access violation writing location 0x00000014.
Run Code Online (Sandbox Code Playgroud)
问题不在我的源代码中,因为我知道它在我的 VS2010 项目中工作,并且我使用相同的实现在我的 VS2012 项目中加载 png。我不确定我链接到的库是在 VS2010 中构建的,或者 VS2010 构建的库中是否有一些我的 VS2012 项目不喜欢的命令行/编译器设置。我已经阅读了 png 文档并在网上搜索了几个小时,但似乎找不到任何相关内容。任何形式的帮助、提示、指示或建议都会对我有很大帮助。
小智 5
阅读 libpng 源代码中的文件projects/vstudio/readme.txt,特别是从第41行开始的段落。
您正在将 (FILE*) 传递给 libpng,可能使用 png_init_io。当 Visual Studio 尝试访问底层 FILE 结构时,它会在 fread 内部崩溃。
这是因为您使用 fopen 从一个 Visual Studio 运行时创建了 FILE*,但 libpng 链接到另一个 Visual Studio 运行时(msvcrt 或类似的东西);两个运行时不兼容。
有很多方法可以导致这种情况发生,但如果您使用 zlib DLL,几乎肯定会发生这种情况。您是使用projects/vstudio 构建libpng 还是尝试自己构建?如果您没有使用projects/vstudio,那么您就得靠自己了;-)
1) 不要将 libpng 和 zlib 都构建到单独的 DLL 中;将 libpng DLL 链接到静态 zlib(这就是项目/vstudio 所做的)或在项目中使用静态 libpng(不是 DLL)(项目/vstudio 也构建了其中之一。)
2) 阅读各种 Visual Studio 运行时。您运行的所有内容都必须使用完全相同的运行时;检查每个项目以查看其运行时间。最好使用默认值 (/MD)
3) 如果您认为您在 libpng 中遇到了错误,请静态链接您的应用程序(即不要使用 Visual Studio 构建的任何 DLL),然后重试。Windows DLL 没问题;使用 Visual Studio 运行时的 Visual Studio 会破坏一切。
4) 如果问题发生在静态链接时,请确保您的 DEBUG 设置在各处都相同。您不能混合使用“n'max DEBUG”,因为 MSVC 运行时的调试版本(其中任何一个,甚至是 Visual Studio 之前的版本)与发布版本不兼容。
事实上最好不要使用 png_init_io;libpng 支持这一点。提供您自己的读写回调。您可以在这些 (fread) 中安全地使用 stdio,因为它们是在与调用 fopen 相同的 DLL(您编写的)中实现的。只要您不跨 DLL 边界传递 (FILE*),您就应该是安全的;没有人解释或理解这两个 DLL(zlib、libpng)的行为。
约翰·鲍勒