作者:朱金灿

来源: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的配置

png库结合zlib库使用出现的一个链接问题的解决的更多相关文章

  1. zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译

    前言   方便做嵌入式arm的交叉移植zlib库.   Zlib库   zlib被设计为一个免费的,通用的,法律上不受限制的-即不受任何专利保护的无损数据压缩库,几乎可以在任何计算机硬件和操作系统上使 ...

  2. 利用zlib库进行zip解压

    1:到zlib官网上下载zlib,本文下载的是1.2.8的版本. 2:进行./configure,然后make. 3:进入zlib库中的contrib/minizip/路径下make,生成的miniz ...

  3. 【转】 C++使用zlib库(-)

    来自:  http://blog.chinaunix.net/uid-24607609-id-2118143.html   今天看到一个gzopen函数,搜了一下他的系列函数,及相关用法   C++使 ...

  4. ZLIB 库

    zlib 编辑 zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表.zlib使用DEFLATE算法,最初是为libp ...

  5. Windows下zlib库和libPng库的编译和使用

    关于zlib库和libpng是干嘛的,我就不说了,度娘和谷歌都能告诉你.这里主要记录下windows下如何利用vs2010编译和使用这两个库. 一.zlib库的编译 首先要下载这个库,这个谷歌和百度也 ...

  6. zlib库VS2015编译步骤

    [点击这里下载zlib1.2.8源码](http://zlib.net/zlib128.zip) [点击这里下载zlib1.2.8编译动态库](http://zlib.net/zlib128-dll. ...

  7. 如何在 window7 环境编译 zlib 库?

    1.下载最新版本 zlib 库 `下载地址:http://www.zlib.net/ 2.打开vc14项目 解压下载的 zlib.zip 压缩包并打开zlib1211\zlib-1.2.11\cont ...

  8. [Zlib]_[初级]_[使用zlib库压缩和解压STL string]

    场景 1.一般在使用文本json传输数据, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩成二进制. 说 ...

  9. VS编译 x64版本zlib库

    编译的过程倒也不是很难.我把编译的源码和脚本及说明都放在gitee上了. 详细的可以见这里 https://gitee.com/solym/zlib-1.2.11.git 可以参考这些文章 win10 ...

随机推荐

  1. js判断PC端与移动端跳转

    在网上看到很多这样类似的代码,但是有的很复杂,或者有的没有判断完全,上次经理去见完客户回来讲,使用苹果浏览打开pc端(pc已经做了识别跳转)会自动跳转到移动端的网页去,后来经测试才发现 documen ...

  2. node——Commonjs

    ECMA只规范了js最近的一些能力,并没有规范当要用js写一个庞大的项目如果使用模块化开发. CommonJS规范了当我们想开发大型程序的时候如何模块化来开发,以及模块化的时候,不同文件的通讯. Co ...

  3. (4)pyspark---dataframe清理

    1.交叉表(crosstab): pandas中也有,常和pivot_table比较. 查看家庭ID与评分的交叉表: 2.处理缺失值:fillna withColumn:新增一列数据 cast : 用 ...

  4. android handler传递数据

    起因:在android使用get请求获取验证码时需要重开一个线程,这就造成了我无法获取到从服务器后台返回的数据 解决方法:创建全局变量,将返回的数据解析后返回给handler,再在handler中将数 ...

  5. JavaScript 运行机制 & EventLoop

    JavaScript 运行机制 & EventLoop 看阮老师博客和自己的理解,记录的学习笔记,js的单线程和 事件EventLoop 机制. 1. JavaScript是单线程 JavaS ...

  6. HDU 1086 You can Solve a Geometry Problem too( 判断线段是否相交 水题 )

    链接:传送门 题意:给出 n 个线段找到交点个数 思路:数据量小,直接暴力判断所有线段是否相交 /*************************************************** ...

  7. MySQL的读写分离的几种选择

    MySQL的读写分离的几种选择 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 原址如下: http://heylinux.com/archives/1004. ...

  8. el-select 根据value查询其对应的label值

    <el-form-item label="库位" prop="goodsLocationId" > <el-col :span="1 ...

  9. thinkphp 同一字段不同查询条件实现

    搞定了 另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起,例如:$map['name'] = array(array('like','%a%'), array('like',' ...

  10. tp框架 JS里面获取session

    var var_name="{:session('xxxxx')}"; 用大括号 这个方法可以获取session