7z文件格式及其源码linux/windows编译
7z文件格式及其源码的分析(二)
一. 准备工作:
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源码
两种方式,一种命令行使用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编译的更多相关文章
- 7z文件格式及其源码
7z文件格式及其源码的分析(四) 这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详 ...
- 7z文件格式及其源码的分析
7z文件格式及其源码的分析 本文是一个系列. 主要是分享我最近一年做7z文件开发的经验. 主要包括7z官方源码的结构分析, 以及7z文件格式的分析. 其中涉及到7z源码结构的各个细节, 以及7z文件格 ...
- 7z文件格式及其源码的分析(五)
这是7z文件格式及其源码的分析系列的第五篇. 上一篇讲到了7z文件压缩流程.最近太忙了,好久没更新,都快忘了写到哪了.:) 这一篇就说说7z文件的尾头的生成方式吧. 上一篇已经讲了尾header的结构 ...
- 7z文件格式及其源码的分析(四)
这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详细结构. 一, 第一个概念: co ...
- 7z文件格式及其源码的分析(三)
上一篇在这里. 这是7z文件格式分析的第三篇, 相信有了前两篇的准备,你已经了解了7z源码的大致结构, 以及如何简单调试7z的源码了. 很多同学是不是迫不及待想要拔去7z的神秘外衣,看看究竟了. 好 ...
- 7z文件格式及其源码的分析(二)
这是第二篇, 第一篇在这里: 这一篇开始分析7z的源码结构. 一. 准备工作: 1. 源码下载: 可以从官方中文主页下载:http://sparanoid.com/lab/7z/. 为了方便, 这里直 ...
- 如何在Kali Linux下编译Windows Exploit
前言 微软的Windows在企业或是个人应用领域占据着最大的市场份额,在渗透测试过程中你会经常遇到很多Windows的工作站和服务器.另一方面,大多数渗透测试人员主要使用基于Linux的发行版渗透测试 ...
- 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法
这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编 ...
- Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)
参考链接: MXE.>大多数程序都是在windows平台下开发的程序.windows 在现实中也是绕不过的一个系统平台,做为受过几年VC,MFC”虐待”的程序员,在做为一个程序员之前是一位Lin ...
随机推荐
- LOOPS 概率dp
题意:迷宫是一个R*C的布局,每个格子中给出停留在原地,往右走一个,往下走一格的概率,起点在(1,1),终点在(R,C),每走一格消耗两点能量,求出最后所需要的能量期望 简单概率dp 注意 原地不 ...
- linux学习笔记-7.文件属性
1.查看文件夹属性 ls -ld test 2.文件夹的rwx --x:可以cd进去r-x:可以cd进去并ls-wx:可以cd进去并touch,rm自己的文件,并且可以vi其他用户的文件-wt:可以c ...
- 【原创】MySQL Can't create a new thread报错分析
今天有两台服务器都出现了Can't create a new thread报错. [故障处理过程] 故障发生后登录服务器,检查mysql进程正常,但登录mysql报下面错误 ERROR 1135 (H ...
- 使用Runnable接口创建线程
实现Runnable接口的类必须使用Thread类的实例才能创建线程.通过Runnable接口创建线程分为两步: 1.将实现Runnable接口的类实例化. 2.建立一个Thread对象,并将第一步实 ...
- AWT事件模型
1.什么是事件 1)事件------描述发生了什么的对象 [事件与异常类似,是由一个个类构成的,当一个事件产生的时候,实际上是由对应的那个事件的类来生成了一个对象,这个对象封装了与这个事件相关的信息, ...
- Android-Drawable(三)
Android-Drawable(三) 前两两篇文章已经学习了6个Drawable,接下来我们继续学习剩下的一些Drawable. Android系统的Drawable(一) Android系统的Dr ...
- leetcode 两个排序的中位数 python
两个排序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 n ...
- Ubuntu 18.04 更新源
[原因] 使用国外的源,在更新软件的时候会很慢,换成国内的源会快很多. [命令] 1.备份源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list ...
- BZOJ4205 : 卡牌配对
对于两张卡牌,如果存在两种属性值不互质,则可以匹配. 只考虑200以内的质数,一共有46个,可以新建3*46*46个点来表示一类属性值中有这两种质数的卡牌. 然后对于每张卡牌,枚举它的质因子,最多只有 ...
- BZOJ2915 : [Poi1997] gen
设f[i][j]表示串ij可以由哪些字母成长过来,用二进制压位表示. 设g[i][j]表示给定串中[i,j]这个区间一开始可以由哪些字母成长多来,用二进制压位表示. 设h[i]表示给定串前i位最少需要 ...