1. 程式人生 > >zlib庫 在windows下的編譯與使用

zlib庫 在windows下的編譯與使用

        最近在網上down了一個系列資料,儲存格式是.tar.gz,裡面是成千上萬的小檔案,200+M的壓縮格式展開來能有好幾個G,為了各種意義上的方便,希望能使用C++直接進行線上操作,而不需要解壓縮出所有檔案。因此找到了zlib庫,也就是deflate演算法的一個C庫。

        出於方便考慮,希望能在windows下使用這個庫。作業系統是windows 8.1 64bit。使用了VS2012的系列工具。

        下載了zlib1.2.8。

        解壓之後,找到 

                ./win32/Makefile.msc

        開啟之後,開頭的註釋部分就是如何在Windows下用VC編譯的方法。

# Makefile for zlib using Microsoft (Visual) C
# zlib is copyright (C) 1995-2006 Jean-loup Gailly and Mark Adler
#
# Usage:
#   nmake -f win32/Makefile.msc                          (standard build)
#   nmake -f win32/Makefile.msc LOC=-DFOO                (nonstandard build)
#   nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \
#         OBJA="inffas32.obj match686.obj"               (use ASM code, x86)
#   nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \
#         OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"  (use ASM code, x64)

       作為一個64位系統,我選擇了最後一種方式編譯。命令中使用到了三個額外的obj檔案:OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"

       開啟目錄

          ./contrib/masmx64/

       找到裡面的bld_ml64.bat,並且用notepad檢視,可以發現只有兩行命令,使用ml64.exe編譯出obj檔案。ml64.exe是VS自帶的工具,在我的電腦上位於

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64

       可以將其複製過來,然後執行bld_ml64.bat。得到兩個obj檔案,複製到zlib根目錄,出於保險起見,也把inffas8464.c複製到了根目錄。

       接下來就是執行那段命令了,在開始選單中找到:

VS2012 x64 Native command prompt

       執行之,進入一個shell的環境,這個環境是一個經過特殊配置的cmd環境,可以直接執行VS提供的很多工具,而不需要加路徑。

       這樣來說,之前的那個bat檔案在這個環境應該可以直接執行,從而省去把ml64.exe複製過來的工作。

       執行:

nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I. OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"

       得到*.lib *.dll ,這就是編譯好的zlib庫了。

       使用的時候,包含根目錄下的zlib.h和zconf.h,然後有3種選擇:

1、使用靜態庫

       將zlib.lib新增到工程裡就可以。有問題可以找百度。

       這樣會將使用到的zlib程式碼內嵌到程式中,無需dll檔案。

2、使用動態庫1

      將zdll.lib加入到工程裡,然後將zlib.dll放到程式的執行目錄下,使得執行的時候不會報找不到dll的錯誤。

      這樣會將呼叫dll檔案的程式碼內嵌到程式中,使得在使用程式在載入的時候自動將使用到的函式從dll中載入記憶體。

3、使用動態庫2

      以上兩種方法需要標頭檔案的支援,第三種方法連標頭檔案都可以省略了。使用VC的動態庫載入函式,在程式中自己寫載入、呼叫動態庫的程式碼。

      這需要dll檔案的支援。這樣做的目的通常是為了能把zlib當成可選的元件使用,如果有這個dll檔案,就載入並使用,否則就用自己寫的其他程式碼做同樣的事情。

      由於沒有標頭檔案的依賴,因此在編譯的時候可以不使用zlib標頭檔案,從而可以實現“將其當作元件”的功能。