QT之quazip解压缩zip文件
(2018-06-15 13:19:49)
1 从
https://github.com/stachenov/quazip
链接下载 quazip源码。
从步骤2中解压出源码,找
到“ zlib1.2.11\contrib\vstudio”目录,里面有各个VS版本的源码,我本机用的是VS2017,,故我用VS2017打开vstudio\vc14\zlibvc.vcxproj
编译,之后会在X64文件夹下的ZlibDllDebug、ZlibDllRelease目录下生成
用vs2017打开 quazip源码的工程或解决方案文件进行编译,此时会弹出找不到“zlib.h”、“zconf.h”文件,这是因为quazip引用了zlib的“zlib.h”、“zconf.h”文件,将步骤3中解压出的zlib源码中的“zlib.h”、“zconf.h”拷贝到该工程目录中,并添加进工程,且将所有的将所有的#include左尖括号zlib.h右尖括号(新浪自动将尖括号屏蔽了,不能显示,所以改为文字描述)改为#include"zlib.h",将所有的#include左尖括号zconf.h右尖括号(新浪自动将尖括号屏蔽了,不能显示,所以改为文字描述)改为#include"zconf.h"再次进行编译,结果报Qt的某些头文件找不到的错误,在工程文件中配置好Qt的一些目录,之后再次编译,又弹出:“找不到QtCore4d.lib”的错误”,这是因为下载的quazip源码中的工程中默认用的是Qt
4,而我本机装的是Qt5,因为没有安装Qt 4,也就是没有QtCore4d.lib。用记事本或其它文本编辑器软件打开quazip.vcxproj,将所有的QtCore4d.lib替换为Qt5Cored.lib,将所有的QtCore4.lib替换为Qt5Core.lib,保存后再次用vs2017编译,之后报一堆链接错误,这是因为quazip引用了zlib的库,也就是步骤3中生成的zlibwapi.lib,在工程属性中的“链接器->输入->附加依赖项”中设置好zlibwapi.lib,再次编译链接,又出现了新的链接错误,如下:
用vs2017的x64编写测试用例如下:
2
从
下载zlib源码
3
编译 zlib,以生成相应的库文件
zlibwapi.lib、zlibwapi.dll。
4
编译quazip源码
zipfile.cpp
1> 正在创建库
D:\QtProj\ThirdPart\quazip-master\quazip\x64\Debug\quazip.lib 和对象
D:\QtProj\ThirdPart\quazip-master\quazip\x64\Debug\quazip.exp
1>JlCompress.obj : error LNK2001: 无法解析的外部符号 "public: static
struct QMetaObject const QuaZipFile::staticMetaObject"
(?staticMetaObject@QuaZipFile@@2UQMetaObject@@B)
1>quazipfile.obj : error LNK2001: 无法解析的外部符号 "public: static
struct QMetaObject const QuaZipFile::staticMetaObject"
(?staticMetaObject@QuaZipFile@@2UQMetaObject@@B)
1>quagzipfile.obj : error LNK2001: 无法解析的外部符号 "public:
virtual struct QMetaObject const * __cdecl
QuaGzipFile::metaObject(void)const "
(?metaObject@QuaGzipFile@@UEBAPEBUQMetaObject@@XZ)
1>quagzipfile.obj : error LNK2001: 无法解析的外部符号 "public:
virtual void * __cdecl QuaGzipFile::qt_metacast(char const *)"
(?qt_metacast@QuaGzipFile@@UEAAPEAXPEBD@Z)
1>quagzipfile.obj : error LNK2001: 无法解析的外部符号 "public:
virtual int __cdecl QuaGzipFile::qt_metacall(enum
QMetaObject::Call,int,void * *)"
(?qt_metacall@QuaGzipFile@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
1>quagzipfile.obj : error LNK2001: 无法解析的外部符号 "public:
static struct QMetaObject const QuaGzipFile::staticMetaObject"
(?staticMetaObject@QuaGzipFile@@2UQMetaObject@@B)
1>quaziodevice.obj : error LNK2001: 无法解析的外部符号 "public:
virtual struct QMetaObject const * __cdecl
QuaZIODevice::metaObject(void)const "
(?metaObject@QuaZIODevice@@UEBAPEBUQMetaObject@@XZ)
1>quaziodevice.obj : error LNK2001: 无法解析的外部符号 "public:
virtual void * __cdecl QuaZIODevice::qt_metacast(char const *)"
(?qt_metacast@QuaZIODevice@@UEAAPEAXPEBD@Z)
1>quaziodevice.obj : error LNK2001: 无法解析的外部符号 "public:
virtual int __cdecl QuaZIODevice::qt_metacall(enum
QMetaObject::Call,int,void * *)"
(?qt_metacall@QuaZIODevice@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
1>quaziodevice.obj : error LNK2001: 无法解析的外部符号 "public:
static struct QMetaObject const QuaZIODevice::staticMetaObject"
(?staticMetaObject@QuaZIODevice@@2UQMetaObject@@B)
1>quazipfile.obj : error LNK2001: 无法解析的外部符号 "public:
virtual struct QMetaObject const * __cdecl
QuaZipFile::metaObject(void)const "
(?metaObject@QuaZipFile@@UEBAPEBUQMetaObject@@XZ)
1>quazipfile.obj : error LNK2001: 无法解析的外部符号 "public:
virtual void * __cdecl QuaZipFile::qt_metacast(char const *)"
(?qt_metacast@QuaZipFile@@UEAAPEAXPEBD@Z)
1>quazipfile.obj : error LNK2001: 无法解析的外部符号 "public:
virtual int __cdecl QuaZipFile::qt_metacall(enum
QMetaObject::Call,int,void * *)"
(?qt_metacall@QuaZipFile@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
这是因为缺少moc_xxxx文件引起的,vc不能自动生成moc_xxxx文件,解决方法如下:
启动cmd,cd到quazip源码目录,之后输入如下命令行:
C:\Qt\Qt5.9.0\5.9\msvc2017_64\bin\moc.exe
quaziodevice.h -o moc_quaziodevice.cpp
C:\Qt\Qt5.9.0\5.9\msvc2017_64\bin\moc.exe
quazipfile.h -o moc_quazipfile.cpp
C:\Qt\Qt5.9.0\5.9\msvc2017_64\bin\moc.exe
quagzipfile.h -o
moc_quagzipfile.cpp
上面-o是字母o而不是数字0,moc.exe是QT自带的,请根据qt安装路径的不同更改,将生成的moc_quaziodevice.cpp、moc_quazipfile.cpp、 moc_quagzipfile.cpp加入到 quazip工程再次编译链接成功生成了quazip.lib、quazip.dll
5
编写测试用例
#include
"QtCore/QCoreApplication" // 尖括号不能显示,改为引号
#include
"QCoreApplication"
// 尖括号不能显示,改为引号
#include
"../quazip/JlCompress.h"
#pragma
comment(lib, "quazip.lib")
int main(int
argc, char *argv[])
{
QCoreApplication a(argc,
argv);
JlCompress::compressDir("d:\\test.zip",
QStringLiteral("d:\\相关文档")); //压缩
JlCompress::extractDir("d:\\test.zip",
QStringLiteral("d:\\相关文档222"));//解压缩
return
a.exec();
}
将步骤3生成的zlibwapi.dll和步骤4生成的quazip.dll拷贝到输出目录下,程序能正确压缩和解压文件