Сборка c ++ Qt CLI Tool с помощью Quazip - PullRequest
1 голос
/ 05 июня 2019

так что обычно я в первый раз являюсь разработчиком встроенного программного обеспечения, когда мне нужно сделать что-то подобное ... Так что я совсем не эксперт в этом ... Я зашел так далеко, используя множество методов поиска и проб и ошибок ...

Что я хочу сделать

Мне нужно написать приложение на C ++ CLI, которое может архивировать и распаковывать файлы.

Мои общие условия

Я хочу использовать Qt и Quazip, поскольку Qt не поддерживает архивирование (или делает это). Я хочу собрать с Mingw и CMake для Windows 64bit в системе Windows 64bit.

Насколько я знаю, было бы лучше, если бы я компилировал Quazip статически, чтобы я не зависел от какой-либо другой библиотеки Quazip DLL, которая может присутствовать в других системах ...

Как я думаю, что это работает

  1. Мне нужно скомпилировать zlib
  2. Тогда мне нужно скомпилировать Quazip (с zlib)
  3. Свяжите скомпилированные библиотеки с моим проектом.

Мои исследования

Я нашел два хороших видео на YouTube, которые должны мне помочь:

Ни один из этих способов не сработал для меня. Также я нашел тот пост в блоге, который немного помог ...

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

Этот сайт был доступен до вчерашнего дня, теперь его нет: D

Также я нашел старый вопрос Stackoverflow, который мне немного помог:

Как подключить библиотеку QuaZip в CMake

Подробное описание того, что я сделал:

1. Здание злиб

Скачал последнюю версию 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.

2. Здание Квазип

Теперь грязная часть ...

Загрузка новейшей версии Quazip (версия 0.8.1) с GitHub .

Я пробовал разные способы компиляции Quazip. Тот, к которому я придерживаюсь, был: Откройте файл .pro в Qt creator в папке quazip (папке, в которой находятся источники).

Итак, я добавил скомпилированный zlib в файл Qmake. Следующие строки я добавил в конец файла:

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

Затем соберите Quazip с QtCreator в качестве релизной сборки. При компиляции я получаю

  • quazip.dll
  • libquazip.a

Я копирую все заголовочные файлы из quazip (16 файлов) в папку include и две библиотеки в папке lib.

Теперь у меня есть zippackage в папке сборки.

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, он использует zlib из установки ruby ​​с моего компьютера. Также я добавил

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, все работает нормально. Он находит libs. Я даже могу включить заголовочные файлы 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: неопределенная ссылка на `JlCompress :: compressDir (QString, QString, bool) '

Это означает, что компоновщик не может связать функцию ...

Мой вопрос

Что я делаю не так?Нужно ли мне компилировать Quazip другим способом?

Редактировать 4:

, поскольку теперь он работает, как скомпилировать Quazip как статическую библиотеку, чтобы я могстатически связать его с моим приложением?

Заранее спасибо ...

Редактировать 1:

Вот переменные QUAZIP от создателя Qt: Qauzip

Редактировать 2:

Хорошо.Некоторые новости.libquazip.a это что-то еще и не работает.Если я ссылаюсь на quazip.dll, компиляция работает.Но когда я запускаю приложение, оно вылетает при вызове функции compressDir ...

Редактировать 3:

Это работает.Мне просто нужно было скопировать quazip.dll в скомпилированный исполняемый файл ...

1 Ответ

0 голосов
/ 05 июня 2019

Из Pro-файла 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

Это должно срабатывать при добавлении staticlib к CONFIG в quazip.pro (2-я строка):

CONFIG += qt warn_on staticlib

Есливы не используете qmake для сборки Quazip, просто убедитесь, что вы #define QUAZIP_STATIC характерны для вашей системы сборки

...