關於zlib庫和libpng是干嘛的。我就不說了。度娘和谷歌都能告訴你。這里主要記錄下windows下怎樣利用vs2010編譯和使用這兩個庫。
一、zlib庫的編譯
下邊就開始編譯吧。
(包含動態庫和靜態庫兩種)
1. 首先開啟VS2010的Command Prompt (32bit),也就是命令提示窗體。
2. 進入到zlib-1.2.5/contrib/masmx86文件夾。運行bld_ml32.bat。
(同理。64位的電腦進入masmx64文件夾,運行bld_ml64.bat)。這一步運行bld_ml32批處理文件,里面調用ml命令編譯inffas32.asm和match686.asm。生成inffas32.obj和match686.obj(生成在本文件夾下)。這兩個文件在zlibvc中用到。
3. zlib的vs sln解決方式文件能夠在例如以下路徑中找到:zlib-1.2.5/contrib/vstudio/vc10/zlibv
當中:
下邊介紹怎樣使用編譯好的動態或是靜態庫。(如果項目project已經建立完成)
這里我們把靜態庫zlibstat.lib和動態庫(zlibwapi.dll/zlibwapi.lib)以及zlib.h/zlibconf.h文件放在一個目錄中。
二、使用zlib靜態庫:zlibstat.lib
1. 包括頭文件
2. 定義宏
3. 項目包括.lib文件所在的文件夾:
4. 項目包括.lib文件
5. 項目代碼中 #include "zlib.h"
編譯生成.exe就可以使用。
三、使用動態庫 zlibwapi.lib
1. 包括頭文件2. 定義宏
3. 項目包括.lib文件所在的文件夾:
4. 項目包括.lib文件
5. 項目代碼中 #include "zlib.h"
編譯生成.exe文件須要.dll文件支持(動態載入)
四、libpng的編譯
1. 首先要下載這個庫,我下載的是 libpng-1.2.37。解壓。
2. 這個的解決方式在 libpng-1.2.37/projects/visualc71中,打開 libpng.sln。用vs2010打開可能須要轉換,點擊下一步進行轉換就可以。
3. 不要急着編譯。首先分析這個解決方式:
在編譯的時候,可能會出錯,反正就是各種錯誤,不是缺少這個就是缺少那個的,非常煩人。這里我本來就是想編譯靜態類型的,所以也就沒在研究這個。
下邊改為靜態類型編譯,這里有點麻煩。別着急。
4. 靜態編譯須要宏定義,我們首先打開項目屬性--配置屬性--C/C++--預處理器定義,這里我們看到動態編譯時定義的一些宏。
這里有兩個對我們實用:PNG_BUILD_DLL 和 ZLIB_DLL。
5. 在整個解決方式中查找PNG_BUILD_DLL。我們能夠在pngconf.h文件里看到下邊一段代碼:
Normal' png-on-win32 defines/defaults:
PNG_BUILD_DLL -- building dll
PNG_USE_DLL
(no define)
這里能夠非常明顯的看出,假設我們須要編譯靜態庫,則須要 no define.所以我們刪除 PNG_BUILD_DLL 宏定義。
6. 在整個解決方式中查找 ZLIB_DLL,我們會找到下邊一句話:
If building or using zlib as a DLL, define ZLIB_DLL
這里僅僅是告訴我們。假設我們把zlib作為dll使用。則定義ZLIB_DLL。可是我們這里不希望這么做,所以繼續分析。下邊還有幾句話:
If building or using zlib with the WINAPI/WINAPIV calling convention,
define ZLIB_WINAPI.
Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
這段英文看的不是特別懂,可是能知道,我們定義ZLIB_WINAPI就可以。這個我們在上邊的zlib靜態庫的編譯中也用到了,所以,應該就是這么定義了。
我們在“預處理器定義”中刪除ZLIB_DLL,改為 ZLIB_WINAPI。
7. 宏定義完了,還須要最關鍵的一步,我們在 屬性--配置屬性--常規--項目默認類型中更改為“靜態庫(.lib)。編譯選項改為LIB Debug。編譯生成就可以。
生成的文件為libpngd.lib。
下邊介紹怎樣使用編譯好的靜態庫。
(如果項目project已經建立完成)
這里我們把靜態庫 libpngd.lib 和 png.h/pngconf.h 文件放在一個目錄中。
五、libpng靜態庫(libpngd.lib)的使用。
1. 包括頭文件
2. 定義宏
3. 項目包括.lib文件所在的文件夾:
4. 項目包括.lib文件
5. 項目代碼中 #include "png.h"
編譯生成.exe就可以使用。
注:在編譯的時候,可能會出現下面警告:
warning LNK4099: 未找到 PDB“vc100.pdb”(......);正在鏈接對象。如同沒有調試信息一樣
這個不影響代碼的執行。