zoukankan      html  css  js  c++  java
  • png库结合zlib库使用出现的一个链接问题的解决

    作者:朱金灿

    来源:http://blog.csdn.net/clever101

     

               要使用png库,首先得编译png库,要编译png库,得依赖zlib库的头文件。在使用png库读取一个png文件时,代码如下:

    #include <stdio.h>
    #include "png.h"        // libpng 库的一个重要头文件
    
        int TestPng()
    	 {
    		 int is_png;            //是否为png
    		 char cbHeader[8];    //文件头
    		 FILE *fp = fopen( "D:\DownLoad\(7845C4038415)\1.png", "rb" );
    
    		 if( !fp )
    		 {
    			 puts( "文件打开错误!" );
    			 return 0;
    		 }
    
    		 fread( cbHeader, 1, 8, fp );    //从文件中读取文件头
    
    		 is_png = png_sig_cmp( (png_byte*)cbHeader, 0, 8 );    //检测该文件头是否为png 格式的图片
    
    		 is_png == 0 ? puts( "是png" ) : puts( "不是png" );
    
    		 return 0;
    	 }
    

     编译时出现错误:

    1>libpngd.lib(png.obj): error LNK2019: 无法解析的外部符号 _crc32@12,该符号在函数 _png_reset_crc 中被引用

    1>  libpngd.lib(png.obj) : error LNK2019: 无法解析的外部符号 _inflateReset@4,该符号在函数 _png_reset_zstream 中被引用

        开始以为是缺少引用zlib库的问题。在附加库目录上添加zlib库,依然有这个链接错误。看来是zlib库编译得有问题。搜索了资料,网上的一种做法是:

    解决思路:

    zlib.h头文件,定义了zlib库的导出函数原型,如:ZEXTERN intZEXPORT deflateEnd OF((z_streamp strm));

    注意红色的ZEXPORT ,其原型在zconf.h文件里面定义:

    #ifndef ZEXPORT
    #  define ZEXPORT 
    #endif
    

    看到了吗,默认的ZEXPORT宏,只是个空符号罢了,而实际是其应该表示函数的调用方式。

    解决方法:


    在zconf.h文件将ZEXPORT宏的定义改成下面的形式即可:

    #ifndef ZEXPORT
    #  define ZEXPORT WINAPI
    #endif
    

             我试过这种做法并不正确,导致一大堆编译错误。正确的做法是在zlib的makefile文件(该文件在zlib的源码目录下的win32目录下Makefile.msc)添加预处理器ZLIB_WINAPI,具体是将:

    WFLAGS  = -D_CRT_SECURE_NO_DEPRECATE-D_CRT_NONSTDC_NO_DEPRECATE一行改为

    WFLAGS  = -D_CRT_SECURE_NO_DEPRECATE-D_CRT_NONSTDC_NO_DEPRECATE -DZLIB_WINAPI

              然后在编译libpng库时也加入ZLIB_WINAPI这个预处理器。


    参考文献:

    1. error LNK2019: 无法解析的外部符号 _deflate

    2.关于zlib的配置

  • 相关阅读:
    【Linux】Linux多个关机命令详解
    【树莓派】树莓派(Debian)- root用户无法使用SSH登录
    【树莓派】树莓派3B安装宝塔面板并配置安装LNMP
    class4/class10/UHS-1/UHS-3 SD卡速度等级区别
    electron-h5-网络状态检测
    electron-消息对话框
    electron-上传文件、保存文件
    electron-子窗口与父窗口通信
    electron-打包
    BrowserView-嵌入网页、open打开子窗口
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470094.html
Copyright © 2011-2022 走看看