1.7-ZIP簡(jiǎn)介

7-zip 是一款免費(fèi)的壓縮解壓軟件。ZIP格式的文件默認(rèn)被蘋果和微軟支持,完全不需要額外安裝其他軟件就可以解壓。但對(duì)于非US-ASCII編碼的文件名和大于2GB的ZIP文件,可能需要借助如WinRAR和7-ZIP軟件也解壓。同時(shí)7-ZIP完全免費(fèi),其支持的7Z壓縮格式的壓縮率相對(duì)RAR壓縮格式更好。7-ZIP官網(wǎng)是http://www.7-zip.org/

2.在VS2015上編譯7-ZIP代碼的詳細(xì)步驟

需要的材料:

  1. Microsoft Visual Studio 2015
  2. 可以解壓.bz2(如bunzip2.exe)和.tar文件格式的解壓工具,如WinRAR(用于解壓7-ZIP 9.20 版本源碼)

步驟A:下載并解壓源碼文件

網(wǎng)站上有1)"LZMA SDK"和2)"7-Zip"兩個(gè)項(xiàng)目,我們需要下載"7-Zip",并保存到你本地電腦。

用WinRAR解壓源碼。

對(duì)于9.20版本的源碼可以用下面的命令行解壓(需要安裝bunzip和tar解壓工具):

bunzip2.exe –d 7z920.tar.bz2 tar -xvf 7z920.tar cd CPP

(剩下的命令需要在解壓出來的CPP文件夾下完成)

步驟B:添加Visual Studio環(huán)境到系統(tǒng)Path

主要是添加"ml.exe" 和 "nmake"到系統(tǒng)環(huán)境。

默認(rèn)的VS2015并沒有添加上述兩個(gè)程序到環(huán)境變量里,我們需要運(yùn)行"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat"進(jìn)行添加。上述的路徑可能會(huì)因?yàn)槟惭bVS2015路徑的不同而不同。

步驟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及其更高級(jí)的系統(tǒng))

用vs命令提示符工具nmake,cd到%7z_source%\CPP\7zip目錄,執(zhí)行

nmake NEW_COMPILER=1 MY_STATIC_LINK=1

等待編譯結(jié)束即可,編譯大概需要幾分鐘的,看人品和機(jī)器配置。

步驟E:拷貝出生成的exe

上面的編譯會(huì)產(chǎn)生如下的exe

復(fù)制代碼
.\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            *******************第一次運(yùn)行會(huì)報(bào)錯(cuò),無法加載7-zip庫"Can not load 7-zip library"

.\CPP\7zip\UI\Console\O\7z.exe            *******************第一次運(yùn)行報(bào)錯(cuò),找不到壓縮編碼"7-Zip cannot find the code that works with archives."

.\CPP\7zip\UI\FileManager\O\7zFM.exe    *******************調(diào)頻"Frequency Modulation"

.\CPP\7zip\UI\GUI\O\7z.exe                *******************

 

.\CPP\7zip\UI\Console\O\7z.exe            *******************這個(gè)可以直接用命令行模式使用
復(fù)制代碼

 

使用7za.exe,

copy .\CPP\7zip\Bundles\Alone\O\7za.exe D:\7-Zip\7za.exe ::先單獨(dú)拷貝出exe程序 cd D:\tmp ::進(jìn)入其他目錄(這個(gè)目錄下放一個(gè)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文件到當(dāng)前文件夾

步驟F:用VS打開項(xiàng)目

使用VS打開%7z_source%\CPP\7zip\Bundles\Format7zF\Format7z.dsw,提示遷移有個(gè)錯(cuò)誤。忽略即可。

打開后,第一次全部編譯會(huì)報(bào)錯(cuò)

右鍵項(xiàng)目屬性-》

C/C++ -》常規(guī) –》調(diào)試信息格式 由"用于"編輯并繼續(xù)"的程序數(shù)據(jù)庫 (/ZI)"改為"程序數(shù)據(jù)庫 (/Zi)"

C/C++ -》代碼生成 –》啟用函數(shù)級(jí)鏈接 –》改為"是 (/Gy)"

再次編譯,報(bào)錯(cuò)信息如下(Debug模式下):

原因是由于C盤的特殊權(quán)限造成的。

把輸出路徑改一下:項(xiàng)目右鍵-》屬性-》配置屬性-》鏈接器-》常規(guī)-》輸出文件 改為 比如說"D:\7-Zip\7z.dll"

更改后,請(qǐng)注意 項(xiàng)目右鍵-》屬性-》配置屬性-》鏈接器-》所有選項(xiàng)-》輸入文件 也會(huì)自動(dòng)變?yōu)楦暮蟮穆窂健?

再次編譯,報(bào)錯(cuò)信息如下(Debug模式下):

原因是在Debug模式下7zCrcOpt.asm和AesOpt.asm的 屬性-》配置屬性-》自定義生成工具-》常規(guī)-》輸出是"(OutDir)$(InputName).obj;(OutDir)$(InputName).obj;(OutDir)\%(Filename).obj;%(Outputs)"

右鍵將兩個(gè)asm文件的 屬性-》配置屬性-》自定義生成工具-》常規(guī)-》輸出更改后,再次編譯(Debug模式下),報(bào)錯(cuò)如下:

原因是7zCrcOpt.asm在Debug模式下 屬性-》配置屬性-》自定義生成工具-》常規(guī)-》命令行是"ml.exe -c -omf -Fo(OutDir)(OutDir)(OutDir)%(Filename).obj %(FullPath)"。-omf 意思是"generate OMF format object file".誰知道這是什么鬼。。刪掉。

同時(shí)也把AesOpt.asm 屬性-》配置屬性-》自定義生成工具-》常規(guī)-》命令行改為"ml.exe -c -Fo$(OutDir)%(Filename).obj %(FullPath)"

再次編譯,報(bào)錯(cuò)信息如下:

解決辦法:

項(xiàng)目屬性 –》配置屬性-》鏈接器-》命令行-》其他選項(xiàng)(D)中粘貼"/SAFESEH:NO"

終于編譯通過了

同樣的,如果要修改Release版本,也需要將7zCrcOpt.asm和AesOpt.asm做個(gè)修改。

 

 

附注,7-ZIP目錄結(jié)構(gòu):

復(fù)制代碼
[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
復(fù)制代碼

 

如文中有錯(cuò)誤和疏漏,煩請(qǐng)大俠指正,批評(píng)!