首页 > 解决方案 > 使用 Quazip 构建 c++ Qt CLI 工具

问题描述

所以通常我是一个嵌入式软件开发人员,我第一次需要做这样的事情......所以我根本不是这方面的专家......我已经走了这么远,有很多谷歌搜索和试错方法......

我想做的事

我需要编写一个可以压缩和解压缩文件的 C++ CLI 应用程序。

我的一般情况

我想使用 Qt 和 Quazip,因为 Qt 本身不支持压缩(或支持)。我想在 Windows 64 位系统上使用 Mingw 和 CMake 构建 Windows 64 位系统。

据我所知,最好静态编译 Quazip,这样我就不会依赖其他系统上可能存在的任何其他 quazip DLL...

我认为它是如何工作的

  1. 我需要编译zlib
  2. 然后我需要编译 Quazip (with zlib)
  3. 将编译的库链接到我的项目。

我的研究

我找到了两个很好的 youtube 视频,它们应该对我有所帮助:

这些方法都没有对我有用。我还发现那篇博客文章有点帮助......

http://www.antonioborondo.com/2014/10/22/zipping-and-unzipping-files-with-qt/

这个网站直到昨天才可用,现在它已经消失了:D

我还发现旧的 Stackoverflow 问题对我有所帮助:

如何在 CMake 中连接 QuaZip 库

我所做的详细步骤:

1.构建zlib

从官网下载了最新版本的zlib。版本 1.2.11 我使用以下命令构建 zlib:

cd C:/some/Path/zlib-1.2.11
mingw32-make -f win32/Makefile.gcc

效果很好,我得到了

我将这些文件和所有头文件(11 个文件)复制到一个单独的文件夹中。看起来像这样:

Build
|
+-include
+-lib

包含文件夹中的标头 lib 文件夹中的库。

2.构建Quazip

现在混乱的部分......

从GitHub下载最新版本的 Quazip(0.8.1 版)。

我尝试了各种方法来编译 Quazip。我坚持的是:在 quazip 文件夹(源文件所在的文件夹)内的 Qt creator 中打开 .pro 文件。

然后我将编译好的zlib添加到Qmake文件中。以下是我在文件末尾添加的行:

INCLUDEPATH += "C:/Build/include" 
LIBS += -L"C:/Build/lib" 
LIBS += -lz

然后使用 QtCreator 构建 Quazip 作为发布版本。编译后我得到

我从包含文件夹中的 quazip (16 fils) 和 lib 文件夹中的两个库中复制所有头文件。

现在我在构建文件夹中有一个压缩包。

3. 将 Quazip 和 zlib 添加到我的项目中

将 FindQuazip.cmake 文件从 Quazip Repo 复制到我的项目中。在我的 CMakeLists.txt 中,我添加了以下几行:

set(ZLIB_ROOT "C:/BUILD" CACHE PATH "Path to zlib")
find_package(ZLIB REQUIRED)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
find_package(QuaZip REQUIRED)

我需要设置 ZLIB_ROOT 以便 CMake 使用我想要的 zlib。如果我没有设置 Root,他会使用我 PC 上安装的 ruby​​ 中的 zlib。我还添加了

include_directories(
    "${BASE_DIR}/sources"
    "${QUAZIP_INCLUDE_DIR}"
    )

最后

add_executable(${PROJECT_NAME} ${SOURCES} ${INC_ALL} )

target_link_libraries(${PROJECT_NAME} Qt5::Network Qt5::Core Qt5::Widgets
    ${ZLIB_LIBRARIES}
    ${QUAZIP_LIBRARIES}
    )

然后我需要添加 FindQuazip.cmake,因为它会找到库:我编辑了以下内容:

FIND_PATH(QUAZIP_LIBRARY_DIR
          WIN32_DEBUG_POSTFIX d
          NAMES libquazip.a #quazip.dll
          HINTS "C:/Build/lib"
          PATH_SUFFIXES QuaZip/lib
          )
FIND_LIBRARY(QUAZIP_LIBRARIES NAMES libquazip.a HINTS ${QUAZIP_LIBRARY_DIR})
FIND_PATH(QUAZIP_INCLUDE_DIR NAMES quazip.h HINTS ${QUAZIP_LIBRARY_DIR}/../include)
FIND_PATH(QUAZIP_ZLIB_INCLUDE_DIR NAMES zlib.h)

好的,我花了两天时间才到达我现在所在的位置。现在,当我运行 CMake 时,一切正常。他找到了库。我什至可以包含 Quazip 的头文件。但是当我尝试编译一个最小的例子时,链接器找不到任何符号。最小的例子:

#include <iostream>
#include <QApplication>
#include "JlCompress.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    cout << __cplusplus << endl;
    cout << "Hello World!" << endl;

    JlCompress::compressDir("C:/WorkspaceLokal/Test/test.zip", "C:/WorkspaceLokal/Test/TestFolder");
    return a.exec();
}

通过编译它,我得到以下错误:

C:\some\path\sources\main.cpp:-1: Fehler: undefined reference to `JlCompress::compressDir(QString, QString, bool)'

这意味着链接器无法链接函数......

我的问题

我究竟做错了什么?我需要以其他方式编译 Quazip 吗?

编辑4:

因为它现在可以工作了,如何将 Quazip 编译为静态库,以便我可以将它静态链接到我的应用程序?

提前致谢...

编辑1:

以下是来自 Qt creator 的 QUAZIP 变量: 考兹普

编辑2:

好的。一些新闻。libquazip.a 是别的东西,它不起作用。如果我链接到 quazip.dll 编译工作。但是当我运行应用程序时,它在函数调用 compressDir 处崩溃......

编辑3:

有用。我只需要将 quazip.dll 复制到已编译的可执行文件中...

标签: c++qtcmakequaziplibz

解决方案


来自 QuaZip 的专业文件:

# You'll need to define this one manually if using a build system other  
# than qmake or using QuaZIP sources directly in your project.  
CONFIG(staticlib): DEFINES += QUAZIP_STATIC

这应该在您添加staticlibCONFIGquazip.pro (第 2 行)时触发:

CONFIG += qt warn_on staticlib

如果您不使用 qmake 构建 Quazip,只需确保您#define QUAZIP_STATIC以特定于构建系统的方式


推荐阅读