原始碼包為:libpng-1.2.8, zlib-1.2.5
編譯工具:VS2008
1. 編譯zlib-1.2.5
1.1 錯誤資訊:會出現錯誤為找不到match686.obj與inffas32.obj。
解決辦法:看了一下附加依賴項裡面有
..\..\masmx86\match686.obj
..\..\masmx86\inffas32.obj
這兩項,在相應目錄下找到這兩個檔案match686.asm和inffas32.asm,看了一下這兩個檔案裡的說明,即可編譯:
在開始菜單中開啟Visual Studio 2008命令提示字元,轉到masmx86目錄,執行
ml /coff /Zi /c /Flinffas32.lst inffas32.asm
產生inffas32.obj檔案
ml /coff /Zi /c /Flmatch686.lst match686.asm
產生match686.obj檔案
1.2 出現類似:fatal error C1853 先行編譯標頭檔來自編譯器的早期版本,或者先行編譯頭為 C++ 而在 C 中使用它(或相反) 或者
在尋找先行編譯頭時遇到意外的檔案結尾。是否忘記了向源中添加#include "stdafx.h
解決辦法:找到所有的.c源檔案,右鍵點擊屬性,將使用先行編譯頭去掉,不使用先行編譯頭。
1.3 測試產生的lib檔案和dll庫。
產生匯出函數時使用是一個def定義檔案匯出函數,但是引用時用到zlib.h標頭檔,需要匯入函數。
在zlib.h的標頭檔中有一個ZEXPORT宏定義,另外還有一個條件編譯宏ZLIB_WINAPI,在項目預先處理屬性中要加上如上條件編譯。在同一工程中,有一個testzlib項目,裡面有所有需要的條件編譯變數,可以直接複製過來。具體為:
ASMV
ASMINF
WIN32
_DEBUG
_CONSOLE
ZLIB_WINAPI
_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_WARNINGS
2. 將zlib庫引入工具中,加入zlib標頭檔,開始編譯libpng-1.2.8
21. 出現如下錯誤:
1>png.obj : error LNK2019: unresolved external symbol __imp__crc32 referenced in function _png_reset_crc
1>png.obj : error LNK2019: unresolved external symbol __imp__inflateReset referenced in function _png_reset_zstream
1>pngpread.obj : error LNK2001: unresolved external symbol __imp__inflateReset
1>pngrutil.obj : error LNK2001: unresolved external symbol __imp__inflateReset
1>pngpread.obj : error LNK2019: unresolved external symbol __imp__inflate referenced in function _png_process_IDAT_data
1>pngread.obj : error LNK2001: unresolved external symbol __imp__inflate
1>pngrutil.obj : error LNK2001: unresolved external symbol __imp__inflate
1>pngread.obj : error LNK2019: unresolved external symbol __imp__inflateInit_ referenced in function _png_create_read_struct_2
1>pngread.obj : error LNK2019: unresolved external symbol __imp__inflateEnd referenced in function _png_read_destroy
1>pngwrite.obj : error LNK2019: unresolved external symbol __imp__deflate referenced in function _png_write_flush
1>pngwutil.obj : error LNK2001: unresolved external symbol __imp__deflate
1>pngwrite.obj : error LNK2019: unresolved external symbol __imp__deflateEnd referenced in function _png_write_destroy
1>pngwutil.obj : error LNK2019: unresolved external symbol __imp__deflateInit2_ referenced in function _png_write_IHDR
1>pngwutil.obj : error LNK2019: unresolved external symbol __imp__deflateReset referenced in function _png_write_compressed_data_out
解決辦法:存細看了一下zlib庫的的相應方法,其實是有定義的。並非無法包含的外部符號。只是有一個條件編譯開關。按照上述1.3 的說明,在前置處理器中加入如下內容:
ASMV
ASMINF
WIN32
_DEBUG
_CONSOLE
ZLIB_WINAPI
_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_WARNINGS
另外還注意:編譯時間的cpu類型要一致,或者都為win32,不一致也可能導致以上錯誤。
編譯即通過。