png庫結合zlib庫使用出現的一個連接問題的解決

做者:朱金燦函數

來源:http://blog.csdn.net/clever101spa

 

           要使用png庫,首先得編譯png庫,要編譯png庫,得依賴zlib庫的頭文件。在使用png庫讀取一個png文件時,代碼以下:.net

#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;
	 }

 編譯時出現錯誤:code

1>libpngd.lib(png.obj): error LNK2019: 沒法解析的外部符號 _crc32@12,該符號在函數 _png_reset_crc 中被引用blog

1>  libpngd.lib(png.obj) : error LNK2019: 沒法解析的外部符號 _inflateReset@4,該符號在函數 _png_reset_zstream 中被引用圖片

 

    開始覺得是缺乏引用zlib庫的問題。在附加庫目錄上添加zlib庫,依然有這個連接錯誤。看來是zlib庫編譯得有問題。搜索了資料,網上的一種作法是:ip

解決思路:get

 

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

相關文章
相關標籤/搜索