c++ - libpng 在 png_write_into 上崩溃(Windows 10,VS2013,自建,所有测试通过 ok)

标签 c++ windows visual-c++ visual-studio-2013 libpng

当调用 png_write_info 时,我观察到由于 libpng (1.6.20) 中的访问冲突导致的崩溃。我已经从源代码(包括 zlib 1.2.8)构建了 libpng,并且 libpng 源代码附带的 png 测试全部通过,没有任何错误。我可以确认在这些测试期间正在创建良好的 png 文件。

我的程序的简单分解(直到崩溃)如下所示。出于简单原因,我删除了所有错误和边界检查:

int main(int argc, char *argv[]) {
    char* filename = argv[1];
    png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info = png_create_info_struct(png);
    if (setjmp(png_jmpbuf(png)))
    {
        abort();
    }

    // Output is 16-bit depth, greyscale format.
    png_set_IHDR(
        png,
        info,
        127, 127,
        16,
        PNG_COLOR_TYPE_GRAY,
        PNG_INTERLACE_NONE,
        PNG_COMPRESSION_TYPE_DEFAULT,
        PNG_FILTER_TYPE_DEFAULT
    );

    // do the file stuff
    FILE *fp;
    errno_t error = fopen_s(&fp, filename, "wb");
    png_init_io(png, fp);
    png_write_info(png, info); // <-- crashes here with "access violation writing location ..."

感谢您的帮助!

代码源

最佳答案

好的,由于这里发布的另一个问题,我得到了这个问题的答案: libpng crashes on png_read_info()

答案是:

If you don't use the Visual Studio defaults your application must still be built with the default runtime option (/MD). If, for some reason, it is not then your application will crash inside libpng16.dll as soon as libpng tries to read from a file handle you pass in.

因此我重新编译了我的 libpng,将属性->配置属性->C/C++->代码生成->运行时库设置为多线程 DLL (/MD)(不是调试!!) 并为我的 png-writer 项目设置相同的设置。现在它可以正常工作,不会再崩溃了。

干杯,
代码源

关于c++ - libpng 在 png_write_into 上崩溃(Windows 10,VS2013,自建,所有测试通过 ok),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309014/

相关文章:

c++ - 从什么数字开始,以下转换整数 -> double -> 整数无效?

c++ - 在 C++ 中调用 VB 的 CreateObject 方法

windows - 工具提示文本被截断

c++ - CMake:如何根据配置和体系结构将不同的文件复制到构建目录

c++ - 为什么编译器会在某些优化级别警告未初始化的边迭代器?

c++ - C++ 中需要什么库?

python - 编译Cython代码时出现"error: Unable to find vcvarsall.bat"

c++ - 如何优化字符串复制(内存分配)?

c++ - 锁定设计模式的名称(具有 `internal' 方法的那个)

c++ - 当一次实现多个 COM 接口(interface)时,我如何向上转换为 IUnknown?