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

來源:互聯網
上載者:User

標籤:windows   zlib libpng   

關於zlib庫和libpng是幹嘛的,我就不說了,度娘和Google都能告訴你。這裡主要記錄下windows下如何利用vs2010編譯和使用這兩個庫。

 

一、zlib庫的編譯

    首先要下載這個庫,這個Google和百度也都可以找得到的。我下載的是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個工程。其中:

   (1). zlibvc產生動態連結程式庫zlibwapi.dll和對應的匯入庫zlibwapi.lib

   (2). zlibstat產生靜態連結庫zlibstat.lib

   (3). testzlibdll測試產生的動態連結程式庫zlibwapi.dll

   (4). testzlib測試產生的靜態連結庫zlibstat.lib        

   最後我們在debug模式下編譯整個解決方案。產生的dll和lib檔案可在相應的檔案夾中找到。

 

下邊介紹如何使用編譯好的動態或是靜態庫。(假設項目工程已經建立完畢)

這裡我們把靜態庫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.lib1. 包含標頭檔
    屬性--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。

 

下邊介紹如何使用編譯好的靜態庫。(假設項目工程已經建立完畢)

這裡我們把靜態庫 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”(......);正在連結化物件,如同沒有調試資訊一樣

這個不影響代碼的運行。



參考 :             http://blog.sina.com.cn/s/blog_74dfa9f40101h33m.html             zlib與libpng下載:http://olex.openlogic.com/packages/zlib/1.2.5                       http://sourceforge.net/projects/libpng/files/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.