1. 程式人生 > >7z文件格式及其源碼linux/windows編譯

7z文件格式及其源碼linux/windows編譯

嵌入 zip2 詳細介紹 eve 鏈接 down 調用 and 測試

一. 準備工作:

1. 源碼下載:

可以從官方中文主頁下載:http://sparanoid.com/lab/7z/.  為了方便, 這裏直接給出下載鏈接: http://downloads.sourceforge.net/sevenzip/7z920.tar.bz2 . 

2. 工具準備:

源碼中給的工程文件都是vc6.0的工程. 作者說他不喜歡新vs的界面. 哎. 不過沒關系, 我們使用VS2008也一樣可以. 有極少地方需要修改一下. 我們使用VS2008 sp1 作為開發環境.

二. HelloWorld:

我們在根目錄下新建一個目錄"7z", 把源碼都解壓到這個位置.

技術分享圖片

我們稍後再詳細解釋這些目錄的意思. 先來一個helloworld, 程序員的最愛.

請直接打開這個路徑: 7z\CPP\7zip\Bundles\Alone\

技術分享圖片

用vs打開其中的 Alone.dsw 文件. 提示要轉換工程文件. 點擊同意. 然後編譯這個工程. 如果不出意外的話, 應該提示你編譯成功了.

這個時候, 打開 c:\util\ 目錄. 裏面已經生成7za.exe. 註意, 這裏是C盤的絕對路徑 : c:\UTIL\7za.exe

好了, 這個7za.exe 就是一個包含全部7z功能的壓縮,解壓命令行工具了.

我們可以從命令行進入該目錄. 輸入 7za.exe 回車. 就能看到它的幫助信息啦.

技術分享圖片

我們先拷貝一個文件到這個目錄, 比如拷貝一個test.txt 到c:\util\ 裏面去. 我們用命令行來壓縮它.

==============

c:\util>7za.exe a test.7z test.txt

==============

這個命令把test.txt 壓縮成test.7z. 這兩個文件名都是可以帶路徑的, 為了方便, 我們都拷貝到當前目錄了.

恩, 我們再來試試解壓.

==============

c:\util>7za.exe x test.7z -oout

==============

這個命令可以吧test.7z 解壓到當前的out目錄下.

試試這兩個命令吧, 是不是還不錯.

三, 目錄結構詳解:

我們先回到最外層目錄:

技術分享圖片

7z源碼基本上是按文件類型分類的.

1. 上面的ASM目錄, 其中保存匯編代碼. 為了極限的性能, 7z使用了部分匯編代碼, crc計算, 和aes加密. 這兩點都不是必須的, 實際上, 它們都有c語言的實現. 7z會檢測, 如果cpu提供了硬件的aes指令, 就會使用硬件aes匯編指令, 而不會使用自己的aes函數.

2. "C" 目錄是7z的核心. 實際上, 7z所有的核心算法都是用c語言實現的. 包括所有的壓縮算法, 以及我們的主角7z打包算法. 這些c代碼非常強悍, 部分代碼可以跨平臺編譯, 甚至能在嵌入式平臺上編譯.

 (a)  這裏面有幾個工程文件值得我們註意, 找到這個位置: 7z\C\Util\7z

技術分享圖片

我們來編譯它. 它會在debug目錄下生成 7zdec.exe

技術分享圖片

這是一個最小化的指包含7z解壓器的獨立exe程序. 有了它就可以解壓文件了.

(b) 找到這個目錄, 7z\C\Util\Lzma

技術分享圖片

編譯之後也會在絕對目錄生成. c:\util\7lzma.exe. 這是一個lzma壓縮算法的工具. 只能壓縮或解壓單個文件. 只包含lzma算法.

這可以用來測試lzma算法.

(c) 打開這個目錄 7z\C\Util\LzmaLib.

這個工程用來生成 只包含lzma算法的 dll. 以便你的程序調用lzma算法.

3. "CPP" 目錄是也是7z的重點.

前面說了核心的算法都在C目錄下面. 那麽CPP目錄是做什麽的呢. 除了核心的算法之外, 7z還有非常豐富的外圍功能. 就是他的文件管理器, 以及右鍵菜單支持等等. 這些與UI和系統相關的功能都是用c++實現的. 此外, C中的核心算法在cpp目錄中都有c++的面向對象的封裝. 我們來逐一介紹它的子目錄:

技術分享圖片

a ) "Windows" 目錄.

其中包含了與windows集成的功能. 包括菜單集成, 剪貼板支持, 文件io,等等.

b) "Common" 目錄.

通用的工具類.

c ) 我們重點介紹 7zip 目錄:

技術分享圖片

(1) "Archive" 目錄. 包含各種 archive ("打包") 算法的代碼. 因為7z不光支持7z文件, 還支持zip, rar, chm等等其他的打包文件格式.   

技術分享圖片

這裏面每個目錄就是一種格式. 7z目錄當然就是我們的主角7z格式了. ( 這裏面的代碼是對C文件夾裏面的代碼的c++封裝. ) 這裏面有一個工程文件.

技術分享圖片

打開這個工程文件, 然後在工程上面點右鍵,查看屬性:

技術分享圖片

可以看到, 它的輸出路徑是: C:\Program Files\7-zip\Formats\7z.dll

這是什麽意思呢? 對, 這個工程就是封裝7z格式的dll. 這個工程的目的就是給我們演示如何讓7z支持我們的自定義格式. 具體怎麽實現自定義格式, 可以參考這個工程以及 它周圍的其他文件夾格式, 比如:Cab, Chm, 等等. 實現相應的com接口, 然後編譯到這個目錄下, 7z就能自動調用了. 以後有時間我們再詳細介紹這個.

(2) 再來看 "Bundles" 目錄.

技術分享圖片

這裏面的Alone目錄, 我們在前面 寫 helloworld 的時候已經見識過了. 它是一個包含全部7z功能的console 的exe.

其中我們再介紹另一個重要的目錄, 就是Format7zF.

技術分享圖片

打開它, 編譯, 會提示幾個鏈接錯誤. 原因是因為作者使用的是vc6. 和我們使用的vs2008一些編譯選項不支持了.

分別在這幾個匯編文件上點擊右鍵:

技術分享圖片

找到"CommandLine" 參數, 把其中的參數刪除: -omf -WX -W3, 只保留 -c

技術分享圖片

然後再編譯就會成功了.

編譯完成之後, 它會在絕對目錄下生成一個dll. C:\Program Files\7-Zip\7z.dll

這個dll是做什麽的呢?

它是包含7z全部功能的dll. 第三方的程序可以調用這個dll實現7z的所有功能. 包括7z自己本身的文件管理器 都是通過這種方式調用的.

好了, 基本上 7z源碼的主要目錄都介紹完了. 大家有什麽疑問可以留言交流.

我們之後的講解都將使用: 7z\CPP\7zip\Bundles\Alone 這個目錄下的工程配合命令行參數來調試講解. 因為這是一個包含7z全部功能的console程序, 簡單好調試.

如果你不想了解7z的文件結構, 只是想在你的程序中集成進處理7z文件的功能. 那麽已經足夠了. 可以打開上面介紹的相應工程, 把源碼集成到你的工程中, 或者直接調用: 7z\CPP\7zip\Bundles\Format7zF 生成的dll. 都是不錯的選擇.

使用Visual Studio編譯7z源碼

2015年10月15日 10:09:38 lniwn 閱讀數:5769 標簽: error 1104error 1107vs7zvisual studio 個人分類: c/c++

兩種方式,一種命令行使用nmake,一種通過visual studio。

0x01 源碼下載

http://www.7-zip.org/download.html

技術分享圖片

0x02 makefile修改

%7z_source%\CPP\Build.mak文件第34行附近,找到LFLAGS = $(LFLAGS) -OPT:NOWIN98,刪除-OPT:NOWIN98選項

此處不修改,後面nmake會報錯,根據提示信息找到對應文件刪除該選項也可以。

參考頁面:http://www.ski-epic.com/2012_compiling_7zip_on_windows_with_visual_studio_10/index.html


0x03 編譯

vs命令提示符工具,cd到%7z_source%\CPP\7zip目錄,執行

nmake NEW_COMPILER=1 MY_STATIC_LINK=1

等待編譯結束即可。


0x04 Visual Studio編譯

使用VS打開%7z_source%\CPP\7zip\Bundles\Format7zF\Format7z.dsw

在7zCrcOpt.asm和AesOpt.asm兩個文件上右鍵屬性,修改其配置信息,如圖技術分享圖片

參考頁面:

http://stackoverflow.com/questions/12387701/error-lnk1104-obj-file-without-any-file-name

http://blog.csdn.net/butwang/article/details/6164933


0x05 Build

技術分享圖片

0x06 Help

關於7z源代碼文件結構說明

[Bundle]
Alone         7za.exe: Standalone version of 7z
Alone7z       7zr.exe: Standalone version of 7z that supports only 7z/LZMA/BCJ/BCJ2
SFXCon        7zCon.sfx: Console 7z SFX module
SFXWin        7z.sfx: Windows 7z SFX module
SFXSetup      7zS.sfx: Windows 7z SFX module for Installers
Format7z            7za.dll:  .7z support
Format7zExtract     7zxa.dll: .7z support, extracting only
Format7zR           7zr.dll:  .7z support, LZMA/BCJ* only
Format7zExtractR    7zxr.dll: .7z support, LZMA/BCJ* only, extracting only
Format7zF           7z.dll:   all formats

[UI]
Agent         Intermediary modules for FAR plugin and Explorer plugin
Console       7z.exe Console version
Explorer      Explorer plugin
Resource      Resources
Far           FAR plugin
Client7z      Test application for 7za.dll

[Compress]
BZip2        BZip2 compressor
Branch       Branch converter
ByteSwap     Byte Swap converter
Copy         Copy coder
Deflate
Implode
Arj
LZMA
PPMd          Dmitry Shkarin‘s PPMdH with small changes.
LZ            Lempel - Ziv

[Crypto]
7zAES         Cipher for 7z
AES           AES Cipher
Rar20         Cipher for Rar 2.0
RarAES        Cipher for Rar 3.0
Zip           Cipher for Zip

7z文件格式及其源碼linux/windows編譯