1.7-ZIP簡介
7-zip 是一款免費的壓縮解壓軟件。ZIP格式的文件默認被蘋果和微軟支持,完全不需要額外安裝其他軟件就可以解壓。但對於非US-ASCII編碼的文件名和大於2GB的ZIP文件,可能需要借助如WinRAR和7-ZIP軟件也解壓。同時7-ZIP完全免費,其支持的7Z壓縮格式的壓縮率相對RAR壓縮格式更好。7-ZIP官網是http://www.7-zip.org/。
2.在VS2015上編譯7-ZIP代碼的詳細步驟
需要的材料:
-
Microsoft Visual Studio 2015
-
可以解壓.bz2(如bunzip2.exe)和.tar文件格式的解壓工具,如WinRAR(用於解壓7-ZIP 9.20 版本源碼)
步驟A:下載並解壓源碼文件
-
Sourceforge下載地址http://sourceforge.net/projects/sevenzip/files/
網站上有1)"LZMA SDK"和2)"7-Zip"兩個項目,我們需要下載"7-Zip",並保存到你本地電腦。
用WinRAR解壓源碼。
-
也可以從官網下載:http://www.7-zip.org/download.html
對於9.20版本的源碼可以用下面的命令行解壓(需要安裝bunzip和tar解壓工具):
bunzip2.exe –d 7z920.tar.bz2 tar -xvf 7z920.tar cd CPP
(剩下的命令需要在解壓出來的CPP文件夾下完成)
步驟B:添加Visual Studio環境到系統Path
主要是添加"ml.exe" 和 "nmake"到系統環境。
默認的VS2015並沒有添加上述兩個程序到環境變量里,我們需要運行"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat"進行添加。上述的路徑可能會因為您安裝VS2015路徑的不同而不同。
步驟C:修正7-ZIP源碼
刪除"源碼\CPP\Build.mak"33行中的"-OPT:NOWIN98",(先解除只讀屬性)
在命令行中刪除33行"-OPT:NOWIN98"的命令如下(需要vim編輯器):
vi .\CPP\Build.mak OLD_BAD_LINE-> LFLAGS = $(LFLAGS) -OPT:NOWIN98 NEW_CORRECT-> LFLAGS = $(LFLAGS)
步驟D:編譯它,生成exe(只支持xp及其更高級的系統)
用vs命令提示符工具nmake,cd到%7z_source%\CPP\7zip目錄,執行 nmake NEW_COMPILER=1 MY_STATIC_LINK=1
等待編譯結束即可,編譯大概需要幾分鍾的,看人品和機器配置。
步驟E:拷貝出生成的exe
上面的編譯會產生如下的exe
.\CPP\7zip\Bundles\Alone\O\7za.exe *******************支持ZIP文件
.\CPP\7zip\Bundles\Alone7z\O\7zr.exe *******************
.\CPP\7zip\Bundles\Fm\O\7FM.exe *******************文件管理'File Manager',圖形界面gui
.\CPP\7zip\Bundles\LzmaCon\O\lmza.exe *******************
.\CPP\7zip\UI\Client7z\O\7z.exe *******************第一次運行會報錯,無法加載7-zip庫"Can not load 7-zip library"
.\CPP\7zip\UI\Console\O\7z.exe *******************第一次運行報錯,找不到壓縮編碼"7-Zip cannot find the code that works with archives."
.\CPP\7zip\UI\FileManager\O\7zFM.exe *******************調頻"Frequency Modulation"
.\CPP\7zip\UI\GUI\O\7z.exe *******************
.\CPP\7zip\UI\Console\O\7z.exe *******************這個可以直接用命令行模式使用
使用7za.exe,
copy .\CPP\7zip\Bundles\Alone\O\7za.exe D:\7-Zip\7za.exe ::先單獨拷貝出exe程序 cd D:\tmp ::進入其他目錄(這個目錄下放一個foo.zip文件)
D:\7-Zip\7za.exe l D:\tmp\foo.zip ::列出foo.zip中的文件。
D:\7-Zip\7za.exe x D:\tmp\foo.zip ::解壓foo.zip文件到當前文件夾
步驟F:用VS打開項目
使用VS打開%7z_source%\CPP\7zip\Bundles\Format7zF\Format7z.dsw,提示遷移有個錯誤。忽略即可。
打開后,第一次全部編譯會報錯
右鍵項目屬性-》
C/C++ -》常規 –》調試信息格式 由"用於"編輯並繼續"的程序數據庫 (/ZI)"改為"程序數據庫 (/Zi)"
C/C++ -》代碼生成 –》啟用函數級鏈接 –》改為"是 (/Gy)"
再次編譯,報錯信息如下(Debug模式下):
原因是由於C盤的特殊權限造成的。
把輸出路徑改一下:項目右鍵-》屬性-》配置屬性-》鏈接器-》常規-》輸出文件 改為 比如說"D:\7-Zip\7z.dll"
更改后,請注意 項目右鍵-》屬性-》配置屬性-》鏈接器-》所有選項-》輸入文件 也會自動變為更改后的路徑。
再次編譯,報錯信息如下(Debug模式下):
原因是在Debug模式下7zCrcOpt.asm和AesOpt.asm的 屬性-》配置屬性-》自定義生成工具-》常規-》輸出是
"$(OutDir)\$(InputName).obj;%(Outputs)",應改為"$(OutDir)\%(Filename).obj;%(Outputs)"
右鍵將兩個asm文件的 屬性-》配置屬性-》自定義生成工具-》常規-》輸出更改后,再次編譯(Debug模式下),報錯如下:
原因是7zCrcOpt.asm在Debug模式下 屬性-》配置屬性-》自定義生成工具-》常規-》命令行是 "ml.exe -c -omf -Fo$(OutDir)%(Filename).obj %(FullPath)"而Release模式下是"ml.exe -c -Fo$(OutDir)%(Filename).obj %(FullPath)"。-omf 意思是"generate OMF format object file".誰知道這是什么鬼。。刪掉。 同時也把AesOpt.asm 屬性-》配置屬性-》自定義生成工具-》常規-》命令行改為 "ml.exe -c -Fo$(OutDir)%(Filename).obj %(FullPath)"
再次編譯,報錯信息如下:
解決辦法:
項目屬性 –》配置屬性-》鏈接器-》命令行-》其他選項(D)中粘貼"/SAFESEH:NO"
終於編譯通過了
同樣的,如果要修改Release版本,也需要將7zCrcOpt.asm和AesOpt.asm做個修改。
附注,7-ZIP目錄結構:
[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