news 2026/9/7 2:45:37

QuaZip编译集成实战:用CMake生成Qt可用的lib/dll

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QuaZip编译集成实战:用CMake生成Qt可用的lib/dll

简介:这是一份专为Windows平台C++开发者准备的QuaZip预编译库资源,面向需要在Qt5项目中处理ZIP/RAR档案的程序员。QuaZip支持打开、创建、读取、更新和删除ZIP文件,并对RAR提供基本读取能力;包内已编译好静态.lib和动态.dll,免去自行构建的繁琐步骤,可直接在Visual Studio、Qt Creator等环境集成。压缩包共29个文件,含17个头文件、5个CMake配置、4个lib库、2个dll运行库及1个pc配置文件,整体仅427KB;文件按install目录组织,便于链接器与包含路径设置。目前已有595人学习下载,适合中高级C++开发者快速为项目补充压缩功能。通过lib与dll的组合,开发者既可静态链接生成独立可执行文件,也可动态加载控制运行时依赖;结合QuaZip提供的getFileInfoList、QuaZipFile等接口,能快速实现档案遍历、文件读取、添加与删除,并借助内置错误处理机制提升程序健壮性,显著降低编码与排错成本。 自己在Qt项目里集成压缩功能时,十有八九会遇到QuaZip这个名字。它是Qt环境下处理ZIP压缩包最顺手的C++库,底层封装了ZLib,接口完全贴合Qt的IO系统,读写ZIP就像操作QFile一样自然。不过QuaZip有个特点——官方基本不发布预编译的二进制包,而是让使用者自己动手编译集成。于是“QuaZip编译好的库lib、dll”就成了一个经久不衰的需求。

这篇文章就是要把整个编译和使用流程拆开揉碎,说清楚为什么需要编译、怎么用CMake生成对应版本的lib和dll、怎么在Qt工程里配置运行环境,还会把编译集成过程中常见的报错和排查经验一起倒出来。适合刚接触QuaZip、只想要一份能跑的Windows版lib/dll,或者被各种编译问题卡住的开发者参考。

1. QuaZip是什么,为什么需要自己动手编译

有些读者可能是临时拿别人的代码来做集成,也有不少人是刚从C#、Java转到Qt开发,对C++生态里的源码编译、链接、动态库这套流程还不熟。先花几百字把QuaZip的背景和定位说清楚。

1.1 核心功能与典型应用场景

QuaZip是一个基于Qt和ZLib的开源ZIP压缩解压库。它最大的特点是把ZIP文件抽象成类似于QFile的对象,开发者在Qt项目里压缩、解压、遍历ZIP条目时,不需要面对一堆C风格的ZLib接口,也不用自己操心内存分配和文件句柄管理,整体代码写起来非常顺手。

典型的应用场景包括:

  • 桌面工具导出报表后打成ZIP包,比如将多个CSV、Excel、图片文件一起压缩归档。
  • 程序更新包的解压模块,下载一个ZIP后直接解压到指定目录并覆盖旧文件。
  • 工程类软件保存项目文件时,用一个.zip格式封装QML资源、JSON配置和二进制数据。
  • 支持密码解压的场景,QuaZip对ZIP标准加密有比较完整的支持。

相比Qt原生就带的QZipReader/QZipWriter(这类API在Qt官方一直没有公开稳定化),QuaZip的接口更全,社区也更活跃,所以很多商业项目会直接选QuaZip来做这块功能。

1.2 直接找现成lib、dll的坑

标题里最吸引人的是“编译好的库”几个字,我也曾经直接去GitHub的Release页面找打包好的二进制文件。结果是绝大多数官方发布版并不提供编译好的产物,第三方分享的DLL又常常因为Qt版本、编译器、位数不匹配导致程序运行时报“应用程序无法启动”或“无法定位程序输入点”。

举个例子:你用MSVC 2019 + Qt 5.15.2编译了调用程序,然后拿到一个用MinGW编译的quazip.dll,加载时往往直接失败。因为MSVC和MinGW生成的动态库对C++名称修饰规则、运行时库的处理完全不同,根本没法混用。

所以“拿到别人编译好的lib、dll”这件事,在自己本地上永远是短视方案。真正一劳永逸的办法是花十五分钟,自己动手把对应版本的QuaZip编译出来,一劳永逸地解决ABI匹配问题。

2. 编译前的环境准备

如果已经用上Qt 5.15或Qt 6.x,那么环境基本齐全。QuaZip本身没有多复杂的依赖,只要把编译器、CMake、Qt安装路径理清楚,编译过程可以做到非常顺滑。

2.1 选择Qt版本与编译器

QuaZip现在对Qt 5和Qt 6都支持,推荐直接使用CMake构建。这意味着只要你安装Qt时勾选了对应的编译套件(比如MSVC 2019/2022或MinGW),并且安装了CMake,环境就准备好了。

几个必须注意的匹配关系:

匹配项说明
Qt版本必须与调用工程一致,比如调用方用Qt 5.15.2,QuaZip也必须是同版本编译
编译器MSVC和MinGW不能混用,Debug和Release也不能混用
位数x64和x86必须清楚区分,一个32位程序加载64位DLL必定失败

我自己的开发环境通常是“Qt 5.15.2 MSVC2019 64位”,所以下面的命令全部以这套环境为例。如果读者用的是MinGW,只需要把生成器参数从Visual Studio换成MinGW Makefiles,其他思路完全一致。

2.2 获取QuaZip源码与依赖关系

QuaZip的源码可以直接从GitHub获取,搜索QuaZip或者直接访问其仓库。下载后先看根目录的CMakeLists.txt,重点关注两个地方。

第一是ZLib依赖。QuaZip底层依赖ZLib,而Qt自带了ZLib动态库,比如Qt5.15.2/5.15.2/msvc2019_64/lib/zlib1.dll。理论上CMake配置时能自动找到Qt自带的ZLib,如果找不到,可以额外指定ZLib的路径。

第二是BZip2和AES相关选项。某些功能会用到libbz2或OpenSSL。如果不依赖这些高级功能,建议直接关闭,少一个依赖就少一个坑。比如把BUILD_WITH_BZIP2设为OFF,把BUILD_WITH_AES设为OFF,官方默认配置下这两项通常可以被正确探测到,但为了编译速度和不必要的系统依赖,我经常手动关闭。

3. 用CMake编译QuaZip的完整步骤

这一部分直接给可以照做的命令行操作。假设已经安装好Qt 5.15.2 MSVC2019 64位,Qt安装目录为C:/Qt/Qt5.15.2/5.15.2/msvc2019_64,QuaZip源码解压到D:/lib/quazip-1.4

3.1 生成工程文件

在源码目录外新建一个build目录,然后执行CMake配置命令:

cd D:/lib mkdir quazip-build cd quazip-build cmake ../quazip-1.4 -G "Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH=C:/Qt/Qt5.15.2/5.15.2/msvc2019_64 -DCMAKE_BUILD_TYPE=Release -DBUILD_WITH_BZIP2=OFF -DBUILD_WITH_AES=OFF

有几点要说明:

  • -DCMAKE_PREFIX_PATH是给CMake找Qt库和头文件的路径。很多人卡在这一步,如果忘记指定,CMake会报“Could not find Qt modules”之类的错误。
  • -G指定使用VS 2019的工程生成器。如果是VS 2022,改为Visual Studio 17 2022
  • -A x64表示生成64位库,如果需要32位,这里改成Win32,同时Qt路径换成对应的msvc2019目录。

配置完成后运行cmake --build . --config Release(或者打开生成的.sln在Visual Studio里选Release模式编译),大约一分钟后就能在build/release目录下看到quazip.dllquazip.lib了。

3.2 编译并检查产物

编译完成后,检查三个目录:

  • 头文件:源码根目录quazip/下的.h文件。
  • 动态库:build/release/quazip.dll
  • 导入库:build/release/quazip.lib

这三个东西在调用工程里分别对应#include、运行时DLL、链接期LIB。

如果编译过程遇到静态库和动态库同时生成了,也不用奇怪。CMake默认会同时生成quazip.dllquazip.lib,其中quazip.lib是动态库的导入库,不是静态库的直接产物,链接时用的是它,运行时需要的还是quazip.dll

3.3 在Qt项目中使用编译好的库

拿到lib、dll和头文件后,叫停编译工作,接下来是工程集成。把以下内容写入Qt工程的.pro文件:

INCLUDEPATH += D:/lib/quazip-1.4/quazip LIBS += -LD:/lib/quazip-build/release -lquazip

如果使用CMake构建Qt项目,则在CMakeLists.txt里:

include_directories(D:/lib/quazip-1.4/quazip) target_link_libraries(MyApp D:/lib/quazip-build/release/quazip.lib)

代码里使用的时候,最简写法如下:

#include <JlCompress.h> QString zipPath = "D:/test.zip"; QString destDir = "D:/unzip"; JlCompress::extractDir(zipPath, destDir);

这个JlCompress.h是QuaZip提供的高级工具封装,简单场景下压缩解压几行代码就能搞定。不过先别急着高兴,运行程序前还要把quazip.dll复制到exe同目录,或者加进系统PATH。开发调试时可以在Qt Creator的运行环境变量里直接把D:/lib/quazip-build/release加进去。

4. 我踩过的坑和排查方法

编译QuaZip整个过程并不难,但集成到真实项目时,各种玄学问题就会冒出来。下面这些是我自己在不同项目里反复踩过的坑,整理成速查列表。

4.1 DLL加载失败,程序启动即崩溃

最典型的错误是Qt5Core.dll找不到,或者quazip.dll加载失败。这类问题十有八九是运行时没有找到Qt自带的DLL。

排查思路:

  1. 用Dependency Walker或者Process Explorer查看exe加载的DLL列表,看是否所有依赖都在。
  2. 确认quazip.dll和调用exe都使用同一个编译器与Qt版本构建。
  3. 如果程序用了release版Qt,而QuaZip却连了debug版,也会报错“无法定位程序输入点于quazip.dll”,必须严格区分Debug和Release。

另外要注意,Qt 5.15版本之前的程序,发布时还要把Qt5Core.dllQt5Gui.dllQt5Widgets.dll等一并带上。简单的做法是使用Qt自带的windeployqt.exe自动拷贝运行库。

关于DLL冲突,我见得最多的场景是项目目录里同时存在多个版本的quazip.dll,系统搜索路径时加载了旧版本,导致某些接口找不到。发布时,在exe同目录且只能有一个quazip.dll,这是铁律。

4.2 CMake找不到Qt模块或ZLib

执行CMake配置时如果提示找不到Qt5Core或Qt6Core,多半是CMAKE_PREFIX_PATH没指向Qt编译器目录。直接将-DCMAKE_PREFIX_PATH设置为Qt对应的库目录即可。

如果提示找不到ZLIB:

  • 确认Qt安装目录的lib下是否有zlib1.dllzlib.lib。有些Qt安装选项不会附带zlib,可以通过Tools/QtCreator目录下查找,或者额外下载zlib源代码自己编译。
  • 也可以开启CMake变量直接用系统安装的ZLib,比如指定-DZLIB_INCLUDE_DIR-DZLIB_LIBRARY
  • 或者最简单的方式,完全避开外部ZLib依赖,把CMake选项里BUILD_SHARED_LIBS和ZLib相关的配置调成Qt内置版本。

还有一种情况是CMake配置时报找不到OpenSSL,是因为BUILD_WITH_AES默认开启导致。如果不需要带密码的高强度AES加密,直接-DBUILD_WITH_AES=OFF,立刻清爽。

4.3 头文件或宏定义不匹配

少部分使用QuaZip源码编译教程的同学,会在编译时碰到“无法打开包含文件‘zlib.h’”或“quazipnewinfo.h找不到”之类的问题。除了确认头文件路径齐全,还要注意宏定义这个隐蔽坑。

在MSVC环境下,如果定义了QUAZIP_STATIC,会让编译代码去找静态库的符号;如果在调用exe里动态链接却定义了该宏,链接时就会报大量无法解析的外部符号。所以:

  • 动态链接:不要定义QUAZIP_STATIC
  • 静态链接:在代码或.pro中定义QUAZIP_STATIC,并链接quazip_static.lib或直接添加源码编译。

4.4 多文件编译与增量编译问题

题外话,很多人在编译器这里被“dll冲突”和“多文件编译”带偏,其实这和QuaZip本身关系不大。QuaZip是常规的C++库,在CMake或qmake工程中都能正常参与增量编译。如果在Visual Studio里修改头文件后出现“unreferenced label”之类的C语言编译错误,通常不是QuaZip导致的,而是代码里某些宏或函数没有正确声明。逐个排查前,先把QuaZip头文件单独放到一个简单测试工程里验证,确认库本身没问题,再去查业务代码。

5. 一些值得说的实操心得

每次折腾第三方库,最难的不是编译本身,而是各种环境下ABI问题的排查。这里分享一下我在多个项目里沉淀下来的经验。

5.1 一定要用脚本固化编译流程

我遇到过一个很现实的问题:几个月后QuaZip升级,或者同事换了一台电脑,要重新生成一份lib和dll。如果每次都手敲CMake命令,很容易因为路径、参数不一致浪费半天时间。

我的做法是写一个简单的构建脚本,把CMake配置、编译、拷贝头文件和DLL到项目第三库目录这几步全部串起来:

@echo off set QT_PREFIX=C:/Qt/Qt5.15.2/5.15.2/msvc2019_64 set QUAZIP_SRC=D:/lib/quazip-1.4 set BUILD_DIR=D:/lib/quazip-build cmake %QUAZIP_SRC% -B %BUILD_DIR% -G "Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH=%QT_PREFIX% -DBUILD_WITH_BZIP2=OFF -DBUILD_WITH_AES=OFF cmake --build %BUILD_DIR% --config Release

这样无论什么时候换机器,双击脚本就能把依赖库准备好,也避免了手动拷贝漏文件的问题。

5.2 调试版本与发布版本用不同目录

如果经常要调试程序,务必分别编译一份Release和一份Debug的quazip.dll。混用版本时,程序会“偶然”跑起来,但一到解压大文件或者频繁压缩时,就会出现内存错误,最难排查。

平时重载提示“zlib1.dll 缺失”,或者其它模块悄悄加载了不同版本的zlib,都可能引发运行时崩溃。所以我在最终发布目录里,除了自己程序的exe和Qt动态库,只会保留一份明确的zlib1.dll,并确认版本来源。

5.3 熟悉C++库集成本质,未来事半功倍

QuaZip只是C++生态里无数需要手动编译的库的一个缩影。只要掌握“CMake + Qt环境 + DLL路径”这一套流程,以后遇到QScintilla、QCustomPlot、libcurl、Darknet这些需要编译的第三方库,都能举一反三。

当然,如果实在不想折腾编译,也可以考虑直接用Qt内置的方案,或者把压缩解压功能交给7zip的独立命令行程序,用QProcess调子进程,这种方式也能满足不少场景,但代码优雅性和实时进度控制就差了。

我在实际项目里还是更倾向把QuaZip编译好之后放进统一的三方库目录,之后所有涉及ZIP操作的功能都通过这个稳定版本进行开发。踩过几次坑之后,总结下来就是:认准Qt版本、认准编译器、严格区分Release和Debug,QuaZip不会再给人添乱。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 2:44:43

零售集团数字化规划与落地:从顶层设计到实施路径

简介&#xff1a;这份PPT资料面向零售集团数字化负责人、业务架构师及转型项目管理者&#xff0c;围绕“以顾客为中心”主线&#xff0c;系统梳理了从顾客营销、门店数字化到总部管控、技术底座的完整规划框架。内容涵盖营销内容/渠道/活动数字化、导购/商品/设备智能化、数据中…

作者头像 李华
网站建设 2026/9/7 2:44:19

VS2017下编译libssh2 64位:CMake配置与OpenSSL集成指南

简介&#xff1a;在Windows 64位环境下集成SSH2能力时&#xff0c;C/C开发者常被libssh2的编译流程困扰。这份资源直接给出使用VS2017编译完成的64位libssh2库&#xff0c;包内共115个文件&#xff0c;含109个头文件、3个静态库、2个运行所需DLL及1个调用示例源文件&#xff0c…

作者头像 李华
网站建设 2026/9/7 2:42:57

降AI工具怎么选?2026年10款优缺点对比(最新)

论文熬了几个夜终于写完&#xff0c;查重也过了正想躺平&#xff0c;结果导师一句“这AI痕迹太重&#xff0c;赶紧降下来&#xff01;”直接给我整破防了&#xff01;盯着红得晃眼的检测报告&#xff0c;不仅头大&#xff0c;更怕卡着延毕。别慌&#xff0c;这种绝望我太懂了&a…

作者头像 李华
网站建设 2026/9/7 2:42:20

基于MATLAB的QPSK通信系统仿真设计与误码率分析

简介&#xff1a;一份面向通信工程、电子信息类专业学生的QPSK通信系统仿真设计毕业设计论文&#xff0c;针对课程设计与毕业设计中的QPSK调制解调建模需求&#xff0c;系统梳理了QPSK实现原理框图、Simulink仿真建模流程以及信号时域变化分析。资源包为单个DOC格式文档&#x…

作者头像 李华
网站建设 2026/9/7 2:42:18

DNV-OS-C101规范解析:LRFD法在海上钢结构强度设计中的工程应用

简介&#xff1a;这份PDF是DNV&#xff08;挪威船级社&#xff09;于2023年7月发布的DNV-OS-C101离岸装置结构设计标准&#xff0c;面向船舶与海洋工程结构设计师、验船师及相关专业学习者&#xff0c;用于替代2019版DNVGL-OS-C101&#xff0c;并对离岸装置的结构设计提供统一技…

作者头像 李华
网站建设 2026/9/7 2:42:12

从beta包到版本管理:项目打包发布归档的完整思路

简介&#xff1a;DeWeb是一款让Delphi开发者无需学习HTML、JavaScript等前端技术&#xff0c;即可将原有Delphi程序快速转换为网页应用的工具&#xff0c;资源包为2020年发布的Beta2版本&#xff0c;适合熟悉Delphi并希望低成本拓展Web端能力的开发者&#xff0c;转换出的页面可…

作者头像 李华