Qt使用quazip库

参考链接: https://blog.csdn.net/zhangxuechao_/article/details/83014473

一般地,源文件被预处理>>编译>>汇编>>链接才能生成可执行程序。

编译汇编的基本流程

  1. 预处理: 将源文件(.c文件)中的#define#include等宏定义和包含的头文件等替换进去,成为新的源文件(.i文件);每个.c文件对应一个.i文件。
  2. 编译: 将(.i文件)编译成为汇编代码(.asm文件,.s文件),每个.i文件对应一个.s文件.
  3. 汇编: 将汇编语言的文件(.s,.asm)翻译成为二进制的文件(内容是一堆机器码, .obj/.o文件),每个.s文件对应一个.o文件。
  4. 连接: 将二进制文件(.o文件)连接在一起,形成一个大的应用程序文件(.o/.exe/.elf等)

静态编译与动态编译

  1. 静态编译:编译器在把源文件(.cpp文件)编译可执行文件(.exe文件)时,主程序中调用的函数接口通过查询包含的头文件(.h),把源文件中要调用的函数代码,翻译为库文件(.lib),然后链接到可执行文件中去,使可执行文件在运行时不需要依赖于动态链接库(.dll文件)。

  2. 动态编译:编译器在把源文件(.cpp文件)编译可执行文件(.exe文件)时,主程序中调用的函数查询包含的头文件(.h),把源文件中要调的函数代码,翻译为动态链接库文件(.dll),然后链接到可执行文件(.exe)中,运行时,可执行文件查询导出库(.lib)文件,在动态链接库(.dll)中查找函数命令。其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是简单的程序,只用了链接库中一两条命令,也要附带相对庞大的链接库;二是若其他计算机上没有安装对应的运行库,动态编译的可执行文件就不能运行。

  3. 综上可知, 不管如何,你要使用一个源码生成库,就必须有以下几个文件:

    • 头文件(.h): 用来给应用程序代码中(主调方)看函数接口定义的;
    • 库文件(.lib/.a): 用来给可执行文件查询.lib的,里面存放着相应函数的地址,或函数的内容。
    • 库文件(.dll/.so): 二进制文件,用来给可执行文件调用的相应的服务函数,它内部实现了被调方的功能。

Qt 使用quazip库进行压缩和解压

1 编译生成windows zlib库

  1. 下载zlib库:http://www.zlib.net/;
  2. 在开始菜单中输入mingling,点击VS2015 x86本机工具命令提示符,切换到目录zlib-1.2.11.tar > zlib-1.2.11 > contrib > masmx86下,运行bld_ml32.bat;
  3. 最终生成的inffas32.objmatch686.obj是我们需要的.
  4. 回到zlib-1.2.11根目录,执行以下命令:nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="contrib/masmx86/inffas32.obj contrib/masmx86/match686.obj".
  5. 生成了zlib1.dll动态库,这是我们后面要用的。

编译生成quazip工程

  1. https://github.com/stachenov/quazip下载quazip文件夹,qztest可以不用下载。
  2. 在quazip目录下(该目录还同时有debian文件夹)下新建文件夹include和文件夹lib
  3. 将zlib中的头文件zlib.hzconf.h放到include中, 把zlib1.dll放到lib中。
  4. 修改quazip.pro工程文件, 添加头文件路径和动态库路径
    INCLUDEPATH += $$PWD/include
    LIBS += -L$$PWD/lib -lzlib1
    
  5. 编译,会自动生成libquazipd.dll(Debug模式下)和libquazip.dll(Release模式下), 以及libquazipd.alibquazip.a

在主调工程中使用

  1. 在工程根目录(该目录下还包括了.pro文件)下新建文件夹include和文件夹lib

  2. 将quazip中所有头文件,如ioapi.h,quazip.h,unzip.h,JlCompress.h等放在include中,将quazip.dllquazipd.dllzlib1.dll放在lib文件夹中。

  3. 在工程文件.pro中,添加头文件和库文件路径。

    INCLUDEPATH += $$PWD/include
    CONFIG(debug, debug|release) {
        LIBS += -L$$PWD/lib -lquazipd
    } else {
        LIBS += -L$$PWD/lib -lquazip
    }
    
  4. 在主调程序中书写以下代码以使用该库:

#include "mainwindow.h"
#include <QApplication>
#include <JlCompress.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    JlCompress::compressDir("D:/testzip/a.zip", "D:/testzipdir1");
    JlCompress::extractDir("D:/testzip/a.zip", "D:/testzipdir2");
    
    return a.exec();
}
原文地址:https://www.cnblogs.com/charleechan/p/12144950.html