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的配置

posted on   岚之山  阅读(1556)  评论(1编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示