так что обычно я в первый раз являюсь разработчиком встроенного программного обеспечения, когда мне нужно сделать что-то подобное ... Так что я совсем не эксперт в этом ... Я зашел так далеко, используя множество методов поиска и проб и ошибок ...
Что я хочу сделать
Мне нужно написать приложение на C ++ CLI, которое может архивировать и распаковывать файлы.
Мои общие условия
Я хочу использовать Qt и Quazip, поскольку Qt не поддерживает архивирование (или делает это).
Я хочу собрать с Mingw и CMake для Windows 64bit в системе Windows 64bit.
Насколько я знаю, было бы лучше, если бы я компилировал Quazip статически, чтобы я не зависел от какой-либо другой библиотеки Quazip DLL, которая может присутствовать в других системах ...
Как я думаю, что это работает
- Мне нужно скомпилировать zlib
- Тогда мне нужно скомпилировать Quazip (с zlib)
- Свяжите скомпилированные библиотеки с моим проектом.
Мои исследования
Я нашел два хороших видео на 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 (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:
Редактировать 2:
Хорошо.Некоторые новости.libquazip.a это что-то еще и не работает.Если я ссылаюсь на quazip.dll, компиляция работает.Но когда я запускаю приложение, оно вылетает при вызове функции compressDir ...
Редактировать 3:
Это работает.Мне просто нужно было скопировать quazip.dll в скомпилированный исполняемый файл ...