7z文件格式及其源碼linux/windows編譯
一. 準備工作:
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 個人分類: 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編譯