使用 Quazip 构建 C++ Qt CLI 工具
Build c++ Qt CLI Tool with Quazip
所以通常我是一名嵌入式软件开发人员,我第一次需要做这样的事情......所以我在这方面根本不是专家......我已经走到这一步了很多谷歌搜索和试验并且错误方法...
我想做什么
我需要编写一个可以压缩和解压缩文件的 C++ CLI 应用程序。
我的一般情况
我想使用 Qt 和 Quazip,因为 Qt 本身不支持压缩(或者不支持压缩)。
我想在 Windows 64 位系统上使用 Mingw 和 CMake 为 Windows 64 位构建。
据我所知,最好静态编译 Quazip,这样我就不会依赖于其他系统上可能存在的任何其他 quazip DLL...
我认为它是如何工作的
- 我需要编译 zlib
- 然后我需要编译 Quazip(使用 zlib)
- Link 编译库到我的项目。
我的研究
我找到了两个不错的 youtube 视频,应该对我有帮助:
这些方法都没有适合我。
我还发现博客 post 有点帮助...
http://www.antonioborondo.com/2014/10/22/zipping-and-unzipping-files-with-qt/
这个网站昨天还可用,现在没了:D
我还发现了一个旧的 Whosebug 问题,它对我有所帮助:
我所做的详细步骤:
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
那些文件和所有 header 文件(11 个文件)我复制在一个单独的文件夹中。看起来像这样:
Build
|
+-include
+-lib
Headers 在 include 文件夹中 libs 在 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.dll
- libquazip.a
我从 quazip (16 fils) 中复制所有 header 文件到 include 文件夹和 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 的 Header 文件。但是当我随后尝试编译一个最小示例时,linker 找不到任何符号。
最小示例:
#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)'
这意味着 linker 不能 link 函数...
我的问题
我做错了什么?
我需要用其他方式编译 Quazip 吗?
编辑 4:
既然它现在可以工作了,我如何将 Quazip 编译为静态库,以便我可以 link 将它静态地应用到我的应用程序中?
提前致谢...
编辑 1:
这是来自 Qt creator 的 QUAZIP 变量:
编辑 2:
好的。一些新闻。 libquazip.a 是别的东西,不起作用。如果我 link 反对 quazip.dll 编译工作。但是当我 运行 应用程序在函数调用 compressDir 时崩溃...
编辑 3:
有效。我只需要将 quazip.dll 复制到已编译的可执行文件中...
来自 QuaZip 的 pro 文件:
# 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
添加到 quazip.pro 中的 CONFIG
(第 2 行)时应该触发:
CONFIG += qt warn_on staticlib
如果您不使用 qmake 构建 Quazip,只需确保您 #define QUAZIP_STATIC
以特定于您的构建系统的方式
所以通常我是一名嵌入式软件开发人员,我第一次需要做这样的事情......所以我在这方面根本不是专家......我已经走到这一步了很多谷歌搜索和试验并且错误方法...
我想做什么
我需要编写一个可以压缩和解压缩文件的 C++ CLI 应用程序。
我的一般情况
我想使用 Qt 和 Quazip,因为 Qt 本身不支持压缩(或者不支持压缩)。 我想在 Windows 64 位系统上使用 Mingw 和 CMake 为 Windows 64 位构建。
据我所知,最好静态编译 Quazip,这样我就不会依赖于其他系统上可能存在的任何其他 quazip DLL...
我认为它是如何工作的
- 我需要编译 zlib
- 然后我需要编译 Quazip(使用 zlib)
- Link 编译库到我的项目。
我的研究
我找到了两个不错的 youtube 视频,应该对我有帮助:
这些方法都没有适合我。 我还发现博客 post 有点帮助...
http://www.antonioborondo.com/2014/10/22/zipping-and-unzipping-files-with-qt/
这个网站昨天还可用,现在没了:D
我还发现了一个旧的 Whosebug 问题,它对我有所帮助:
我所做的详细步骤:
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
那些文件和所有 header 文件(11 个文件)我复制在一个单独的文件夹中。看起来像这样:
Build
|
+-include
+-lib
Headers 在 include 文件夹中 libs 在 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.dll
- libquazip.a
我从 quazip (16 fils) 中复制所有 header 文件到 include 文件夹和 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 的 Header 文件。但是当我随后尝试编译一个最小示例时,linker 找不到任何符号。 最小示例:
#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)'
这意味着 linker 不能 link 函数...
我的问题
我做错了什么? 我需要用其他方式编译 Quazip 吗?
编辑 4:
既然它现在可以工作了,我如何将 Quazip 编译为静态库,以便我可以 link 将它静态地应用到我的应用程序中?
提前致谢...
编辑 1:
这是来自 Qt creator 的 QUAZIP 变量:
编辑 2:
好的。一些新闻。 libquazip.a 是别的东西,不起作用。如果我 link 反对 quazip.dll 编译工作。但是当我 运行 应用程序在函数调用 compressDir 时崩溃...
编辑 3:
有效。我只需要将 quazip.dll 复制到已编译的可执行文件中...
来自 QuaZip 的 pro 文件:
# 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
添加到 quazip.pro 中的 CONFIG
(第 2 行)时应该触发:
CONFIG += qt warn_on staticlib
如果您不使用 qmake 构建 Quazip,只需确保您 #define QUAZIP_STATIC
以特定于您的构建系统的方式