Windows下zlib庫和libPng庫的編譯和使用


關於zlib庫和libpng是干嘛的。我就不說了。度娘和谷歌都能告訴你。這里主要記錄下windows下怎樣利用vs2010編譯和使用這兩個庫。

 

一、zlib庫的編譯

    首先要下載這個庫,這個谷歌和百度也都能夠找得到的。我下載的是zlib-1.2.5,下載完解壓出來就可以。

下邊就開始編譯吧。

(包含動態庫和靜態庫兩種)

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/zlibvc.sln。打開

   這個解決方式中包括6個project。

當中:

   (1). zlibvc生成動態鏈接庫zlibwapi.dll和相應的導入庫zlibwapi.lib

   (2). zlibstat生成靜態鏈接庫zlibstat.lib

   (3). testzlibdll測試生成的動態鏈接庫zlibwapi.dll

   (4). testzlib測試生成的靜態鏈接庫zlibstat.lib        

   最后我們在debug模式下編譯整個解決方式。生成的dll和lib文件可在對應的目錄中找到。

 

下邊介紹怎樣使用編譯好的動態或是靜態庫。(如果項目project已經建立完成)

這里我們把靜態庫zlibstat.lib和動態庫(zlibwapi.dll/zlibwapi.lib)以及zlib.h/zlibconf.h文件放在一個目錄中。

 

二、使用zlib靜態庫:zlibstat.lib

1. 包括頭文件
    屬性--C/C++--常規--附加包括文件夾(加入包括.h文件的文件夾)
2. 定義宏
    屬性--C/C++--預處理器--預處理器定義:加入 ZLIB_WINAPI ASMV ASMINF
3. 項目包括.lib文件所在的文件夾:
    屬性--鏈接器--常規--附加庫文件夾
4. 項目包括.lib文件
    屬性--鏈接器--輸入--附加依賴項(libstat.lib)

5. 項目代碼中 #include "zlib.h"
編譯生成.exe就可以使用。

 

三、使用動態庫 zlibwapi.lib

1. 包括頭文件
    屬性--C/C++--常規--附加包括文件夾(加入包括.h的文件夾)
2. 定義宏
    屬性--C/C++--預處理器--預處理器定義:加入 ZLIB_WINAPI
3. 項目包括.lib文件所在的文件夾:
    屬性--鏈接器--常規--附加庫文件夾
4. 項目包括.lib文件
    屬性--鏈接器--輸入--附加依賴項(zlibwapi.lib)

5. 項目代碼中 #include "zlib.h"
編譯生成.exe文件須要.dll文件支持(動態載入)

 

四、libpng的編譯

1. 首先要下載這個庫,我下載的是 libpng-1.2.37。解壓。

2. 這個的解決方式在 libpng-1.2.37/projects/visualc71中,打開 libpng.sln。用vs2010打開可能須要轉換,點擊下一步進行轉換就可以。

3. 不要急着編譯。首先分析這個解決方式:

    這個解決方式的libpng項目默認是採用的動態庫(.dll)編譯的(屬性--配置屬性--常規--項目默認類型)。我們能夠直接編譯靜態庫。生成.dll文件和.lib文件。

在編譯的時候,可能會出錯,反正就是各種錯誤,不是缺少這個就是缺少那個的,非常煩人。這里我本來就是想編譯靜態類型的,所以也就沒在研究這個。

下邊改為靜態類型編譯,這里有點麻煩。別着急。

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   -- building an application, linking to dll
(no define)   -- building static library, or building an
                 application and linking to the static lib

這里能夠非常明顯的看出,假設我們須要編譯靜態庫,則須要 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. 包括頭文件
    屬性--C/C++--常規--附加包括文件夾(加入包括.h文件的文件夾)
2. 定義宏
    這里由於要用到zlib庫,所以僅僅要定義ZLIB_WINAPI就可以

3. 項目包括.lib文件所在的文件夾:
    屬性--鏈接器--常規--附加庫文件夾
4. 項目包括.lib文件
    屬性--鏈接器--輸入--附加依賴項(libpngd.lib)

5. 項目代碼中 #include "png.h"
編譯生成.exe就可以使用。

 

注:在編譯的時候,可能會出現下面警告:

warning LNK4099: 未找到 PDB“vc100.pdb”(......);正在鏈接對象。如同沒有調試信息一樣

這個不影響代碼的執行。



參考 :

             zlib與libpng下載: http://olex.openlogic.com/packages/zlib/1.2.5                       http://sourceforge.net/projects/libpng/files/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM