加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

QT之quazip解压缩zip文件

(2018-06-15 13:19:49)
1 从
   https://github.com/stachenov/quazip
  链接下载quazip源码。
2  从 

   下载zlib源码

3  编译zlib,以生成相应的库文件
    从步骤2中解压出源码,找
    到“zlib1.2.11\contrib\vstudio”目录,里面有各个VS版本的源码,我本机用的是VS2017,,故我用VS2017打开vstudio\vc14\zlibvc.vcxproj
  编译,之后会在X64文件夹下的ZlibDllDebug、ZlibDllRelease目录下生成
zlibwapi.lib、zlibwapi.dll。
4 编译quazip源码
  用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,再次编译链接,又出现了新的链接错误,如下

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 编写测试用例
  用vs2017的x64编写测试用例如下:
#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拷贝到输出目录下,程序能正确压缩和解压文件

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有