c++ - 使用Quazip构建c++ Qt CLI工具

标签 c++ qt cmake quazip libz

所以通常我第一次是嵌入式软件开发人员,所以我需要做类似的事情...所以我根本不是专家...我已经走了很多搜索和反复试验的方法了...

我想做的事

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

  • Quazip
  • zlib

  • 我的一般情况

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

    据我所知,最好是静态地编译Quazip,这样我就不必依赖于其他系统上可能存在的其他quazip DLL。

    我认为它如何运作
  • 我需要编译zlib
  • 然后我需要编译Quazip(使用zlib)
  • 将编译的库链接到我的项目。

  • 我的研究

    我发现了两个不错的youtube视频,它们应该对我有帮助:
  • https://www.youtube.com/watch?v=5ZTusMX-Reo
  • https://www.youtube.com/watch?v=mxlcKmvMK9Q

  • 这些方法都没有为我解决。
    我也发现那篇博客文章有一点帮助...

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

    这个站点一直可用到昨天,现在它消失了:D

    我也发现了这个古老的Stackoverflow问题,这对我有所帮助:

    How to connect the QuaZip library in CMake

    我所做的详细步骤:

    1.构建zlib

    从官方网站下载了最新版本的zlib。版本1.2.11
    我使用以下命令构建zlib:
    cd C:/some/Path/zlib-1.2.11
    mingw32-make -f win32/Makefile.gcc
    

    那很好,我得到了
  • libz.a
  • libz.dll.a
  • zlib1.dll

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

    include文件夹中的标题lib文件夹中的libs。

    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作为发行版Build Quazip。
    编译后我得到
  • quazip.dll
  • libquazip.a

  • 我从quazip(16个fils)中的include文件夹中复制了所有头文件,在lib文件夹中复制了两个库。

    现在,我在build文件夹中有了一个zippackage。

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

    从Quazip Repo将FindQuazip.cmake文件复制到我的项目中。
    在我的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创建者的QUAZIP变量:
    Qauzip

    编辑2:

    好的。一些新闻。 libquazip.a是其他东西,无法正常工作。如果我链接对quazip.dll,则编译工作正常。但是当我运行该应用程序时,它在函数调用compressDir时崩溃了...

    编辑3:

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

    最佳答案

    从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
    

    当您在quazip.pro(第二行)中的staticlib中添加CONFIG时,这应该触发:
    CONFIG += qt warn_on staticlib
    

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

    关于c++ - 使用Quazip构建c++ Qt CLI工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56455647/

    相关文章:

    C++ 结构内存分配

    c++ - 桥接 USB 主机到设备

    c++ - "Attempting to reference a deleted function"添加 QMutex 到类后

    linux - 为 AWS-Lambda : GLIBC issues 编译 pdftohtml 二进制文件

    c++ - CMake 无法设置 CUDA 标准 c++17

    c++ - 为什么允许将 int 文字设置为指针,但不允许比较?

    c++ - 是否可以使用 Qt 类枚举网络根?

    c++ - Qt - 如何在 Linux 上动态部署应用程序?

    bash - 从 CMake 文件执行 bash 命令

    C++ 将字符串复制到 Char 字符串数组