
简介这是一份专为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.2QuaZip也必须是同版本编译编译器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_64QuaZip源码解压到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_PATHC:/Qt/Qt5.15.2/5.15.2/msvc2019_64 -DCMAKE_BUILD_TYPERelease -DBUILD_WITH_BZIP2OFF -DBUILD_WITH_AESOFF有几点要说明-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.dll和quazip.lib了。3.2 编译并检查产物编译完成后检查三个目录头文件源码根目录quazip/下的.h文件。动态库build/release/quazip.dll。导入库build/release/quazip.lib。这三个东西在调用工程里分别对应#include、运行时DLL、链接期LIB。如果编译过程遇到静态库和动态库同时生成了也不用奇怪。CMake默认会同时生成quazip.dll和quazip.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。排查思路用Dependency Walker或者Process Explorer查看exe加载的DLL列表看是否所有依赖都在。确认quazip.dll和调用exe都使用同一个编译器与Qt版本构建。如果程序用了release版Qt而QuaZip却连了debug版也会报错“无法定位程序输入点于quazip.dll”必须严格区分Debug和Release。另外要注意Qt 5.15版本之前的程序发布时还要把Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.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.dll和zlib.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_AESOFF立刻清爽。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_PREFIXC:/Qt/Qt5.15.2/5.15.2/msvc2019_64 set QUAZIP_SRCD:/lib/quazip-1.4 set BUILD_DIRD:/lib/quazip-build cmake %QUAZIP_SRC% -B %BUILD_DIR% -G Visual Studio 16 2019 -A x64 -DCMAKE_PREFIX_PATH%QT_PREFIX% -DBUILD_WITH_BZIP2OFF -DBUILD_WITH_AESOFF 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和DebugQuaZip不会再给人添乱。本文还有配套的精品资源点击获取