首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Quazip构建c++ Qt工具

用Quazip构建c++ Qt工具
EN

Stack Overflow用户
提问于 2019-06-05 07:04:36
回答 1查看 1.1K关注 0票数 2

所以通常我是一个嵌入式软件开发人员,当我第一次需要这样做的时候.所以我一点也不擅长这个.我已经用了很多谷歌和试错的方法.

我想做什么

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

我的一般情况

我想使用Qt和Quazip,因为Qt不支持本地压缩(或者确实支持)。我想在Windows64bit系统上用明威和CMake为Windows64bit构建。

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

我认为它是如何工作的

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

我的研究

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

这些方法中没有一种对我有效。我还发现那篇博文有点帮助.

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

这个网站昨天还在,现在已经没有了。

此外,我还发现了一个老的堆叠溢出问题,它对我有一点帮助:

如何在QuaZip中连接CMake库

关于我所做的事情的详细步骤:

1.构建zlib

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

代码语言:javascript
复制
cd C:/some/Path/zlib-1.2.11
mingw32-make -f win32/Makefile.gcc

我得到了一个完美的方法

  • libz.a
  • libz.dll.a
  • zlib1.dll

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

代码语言:javascript
复制
Build
|
+-include
+-lib

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

2.建设Quazip

现在混乱的部分..。

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

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

因此,我将编译后的zlib添加到Qmake文件中。下面是我在文件末尾添加的行:

代码语言:javascript
复制
INCLUDEPATH += "C:/Build/include" 
LIBS += -L"C:/Build/lib" 
LIBS += -lz

然后用QtCreator作为发行版构建Quazip。当编译时我得到

  • quazip.dll
  • libquazip.a

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

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

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

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

代码语言:javascript
复制
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。如果我不设置根,他使用从我的PC的红宝石安装的zlib。我还补充说

代码语言:javascript
复制
include_directories(
    "${BASE_DIR}/sources"
    "${QUAZIP_INCLUDE_DIR}"
    )

在最后

代码语言:javascript
复制
add_executable(${PROJECT_NAME} ${SOURCES} ${INC_ALL} )

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

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

代码语言:javascript
复制
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的头文件。但是当我试图编译一个最小的例子时,链接器找不到任何符号。最起码的例子:

代码语言:javascript
复制
#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\source\main.cpp:-1: Fehler:对` `JlCompress::compressDir(QString,QString,bool)‘的未定义引用

这意味着链接器不能链接函数..。

我的问题

我做错了什么?我需要用另一种方式编译Quazip吗?

编辑4:

既然它现在起作用了,我如何将Quazip编译成一个静态库,以便我可以静态地将它链接到我的应用程序?

提前谢谢..。

编辑1:

下面是Qt创建者的QUAZIP变量:

编辑2:

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

编辑3:

它起作用了。我只需要将quazip.dll复制到编译后的可执行文件..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 11:33:19

来自QuaZip的专业档案:

代码语言:javascript
复制
# 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

当您将staticlib添加到CONFIG中的quazip.pro (第2行)时,这将触发:

代码语言:javascript
复制
CONFIG += qt warn_on staticlib

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56455647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档