[No0000AB]用Visual Studio 2015在 WIN10 64bit 上編譯7-zip (32 bit)


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代碼的詳細步驟

需要的材料:

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

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

網站上有1)"LZMA SDK"和2)"7-Zip"兩個項目,我們需要下載"7-Zip",並保存到你本地電腦。

用WinRAR解壓源碼。

對於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM