Как собрать Qt5 как статические библиотеки под Windows - PullRequest
0 голосов
/ 19 октября 2018

Чтобы распространить приложение Qt среди пользователей Windows в виде простого файла .exe, необходимо статически связать статическую версию библиотек Qt.Предположим, мы распространяем нашу лицензию под открытой лицензией, чтобы разрешить статическое связывание Qt.Поэтому нам просто нужны статические двоичные файлы библиотеки Qt5Core, Qt5Gui, Qt5Widgets.Как их получить?

Двоичный дистрибутив Qt5 поставляется только с динамическими библиотеками.Он также содержит некоторые файлы .lib - но будьте осторожны, это не статические библиотеки, а некоторые вспомогательные файлы.Их можно отличить от настоящих статических библиотек по размеру: истинные статические библиотеки намного больше (много МБ в случае компонентов Qt5).Поэтому нам нужно статически скомпилировать Qt5 самостоятельно.Это оказывается на удивление трудным.

Официальные инструкции (http://doc.qt.io/qt-5/windows-building.html) почти бесполезны: слишком короткие, они даже не передают идею о сложности задачи.На сегодняшний день отсутствует пошаговое руководство по компиляции Qt5 в статические библиотеки. Оно должно быть здесь.

1 Ответ

0 голосов
/ 19 октября 2018

Краткий ответ: Не тратьте на это свое время. Ссылка динамически, и пусть установщик распространит ваше приложение.Это единственный режим, который серьезно поддерживается Qt5 и CMake.Работа без их поддержки и против их советов близка к безнадежной.Настроить установщик гораздо проще (хотя и не весело - мы постоянно используем черную магию из https://hk.saowen.com/a/d1cf90fcfea6d511629fd5a6c8113808721a7f19656677e8a5fab370a8d35cd4).

Длинный (но не полный) ответ, если вы хотите перехитрить меня:

Следующие шаги обманчиво приблизили меня к решению: я преуспел в создании статических библиотек, но не смог связать свое приложение: получив сотни ошибок LNK2001 и LNK2019, вызванных загадочными неразрешенными внешними символами, мне пришлось отказаться.

Итак, пошаговое описание того, что сработало для меня в октябре 2018 года на виртуальном рабочем столе Windows 10. Для каждого шага установки указывается проверка. Если проверка не удалась, устраните проблему, прежде чем продолжить.

Для начала установите некоторые инструменты, которые понадобятся позже:

  • Perl , необходимые для конфигурации zlib и openssl:
    • Пропустить, если "perl -v "работает.
    • Получить установщик из https://www.activestate.com/activeperl
    • Запустить установщик -> установит в C: \ Perl64.
    • Проверка: Перезапустить терminal и попробуйте "perl -v".
  • Редактор, который может обрабатывать конец строки Unix.Блокнот не подойдет.Установите vim , emacs или что-либо еще.
  • chocolatey менеджер пакетов, необходимый для установки flex и bison:
    • Runоболочка администратора (меню «Круг»> поиск «Команда»> щелкните правой кнопкой мыши «Командная строка»> запустить от имени администратора)
    • Скопируйте команду загрузки из https://chocolatey.org/install#install-with-cmdexe
    • Вставьте команду в оболочку администратора,и наблюдайте за установкой
    • Проверьте: в терминале попробуйте команду "choco"
  • flex и bison , необходимые для qtbaseкомпиляция:
    • Это не очевидно, чтобы получить правильную версию flex.От gnuwin32.sourceforge.net я получил устаревший flex, который пропустил аргумент командной строки, необходимый во время компиляции Qt.Компиляция flex из исходного кода привносит множество дополнительных зависимостей.Самое простое решение, которое я нашел, использует менеджер пакетов Chocolatey.
    • В командной оболочке запустите: "choco install winflexbison3".Это создаст каталог X , содержащий двоичные файлы win_flex.exe и win_bison.exe и вспомогательную папку «data».Узнайте местоположение X .В моем случае X = C: \ ProgramData \ chocolatey \ lib \ winflexbison3 \ tools
    • Проверьте: cd X и запустите "win_flex --version","win_bison --version".
    • Во время компиляции Qt эти инструменты понадобятся под их стандартными именами "flex" и "bison".Поэтому нам нужны символические ссылки flex-> win_flex, bison-> win_bison.
      • mlink X \ flex.exe X \ win_flex.exe
      • mlink X \ bison.exe X \ win_bison.exe
      • примечание: mklink требуются абсолютные пути для надежной работы
      • примечание: символическая ссылка не должна переходить в другой каталог, чтобы bison не нашел папку «data»
    • Добавьте X к% PATH%
    • Проверьте: в любой оболочке попробуйте "flex --version" и "bison --version""

Пока что для инструментов.Теперь нам нужны две библиотеки, которые должны быть статически связаны с Qt (магия, извлеченная из https://stackoverflow.com/a/41815812/1017348):

  • Сборка статических zlib :
    • Загрузка https://zlib.net/zlib1211.zip
    • Распакуйте в C: \ Development \ zlib-1.2.11
    • Отредактируйте файл win32 \ Makefile.msc с помощью редактора, который может обрабатывать EOL Unix:
      • Найдите строку, начинающуюся сCFLAGS
        • Заменить -MD на -GL -MT -Zc: wchar_t-
      • Найти строку, начинающуюся с LDFLAGS
        • Заменить -debug на -opt: icf -dynamicbase -nxcompat -ltcg / nodefaultlib: msvcrt
    • Сборка zlib с помощью следующей команды (должна занимать менее минуты):
      • nmake -f win32 / Makefile.msc AS = ml64 LOC = "- DASMV -DASMINF -DNDEBUG -I."OBJA = "inffasx64.obj gvmat64.obj inffas8664.obj"
    • Проверка: в результате исходный каталог должен содержать zlib.lib (856 КБ), среди прочего.
  • Сборка статической openssl библиотека:
    • Загрузка https://www.openssl.org/source/openssl-1.1.1.tar.gz
    • Распаковка в C: \ Development \ openssl-1.1.1
    • Копирование файлов из zlib: cd zlib-1.2.11;xcopy zconf.h .. \ openssl-1.1.1 \;То же самое для zlib.h zlib.lib zlib.pdb
    • cd .. \ openssl-1.1.1
    • perl Настройка VC-WIN64A no-asm без общего доступа zlib no-zlib-динамические потоки--prefix = C: \ opt \ local_x64
      • примечание: я добавил «no-asm», чтобы избежать установки NASM (Netwide Assembler)
      • примечание: я изменил префикс, поскольку только администраторы могутустановить в C: \ Windows
    • Редактирует файл '' makefile '':
      • Найти строку, начинающуюся с: CFLAG
        • Добавить: /Zc: wchar_t- / GL / Zi
      • Найти строку, начинающуюся с: LDFLAGS
        • Заменить / отладить на / incremental: no / opt: icf / dynamicbase / nxcompat/ ltcg / nodefaultlib: msvcrt
      • Найдите строку, начинающуюся с: CNF_EX_LIBS
        • Замените ZLIB1 на zlib.lib
    • Сборка: "nmake"
    • Проверка: каталог должен содержать openssl.lib (размер?)

Теперь мы готовы к сборке qtbase из источника, используя командную строку vВерсия компилятора Visual Studio C ++:

  • Загрузка (местоположение обновления для последней версии Qt): https://download.qt.io/archive/qt/5.11/5.11.2/submodules/qtbase-everywhere-src-5.11.2.zip
    • Распаковка занимает около 20 '
  • Переместить исходный каталог на локальный диск (C: \ Development)
    • Для работы с Visual Studio используйте специально настроенный терминал.Используйте Панель задач> Круг> Поиск, чтобы запустить «Командная строка x64 Native Tools для VS 2017»
  • cd qtbase ...
  • Проверка: настройка --help
  • configure -platform win32-msvc2017 -opensource -confirm-license -release -static -openssl-связанный no-dbus -no-libpng -no-libjpeg -nomake примеры -nomake тесты -prefix C: \ opt \ local_x64 -IC: \ Development \ openssl-1.1.1 \ include -LC: \ Development \ openssl-1.1.1 -D OPENSSL_LIBS = C: \ Development \ openssl-1.1.1 \ libssl.lib
    • при отладке "настроить", может потребоваться удалить config.cache.
    • опция -I не работает с относительными путями
    • метка" win32 "может выглядеть неправильно, если мы хотим использовать Qt в 64-битномприложения, но мы советуем не беспокоиться: сборка Qt под Windows: действительно с "-platform win32-msvc2017"?
    • Я не знаю, как избавиться от Sql: https://bugreports.qt.io/browse/QTBUG-71253
    • libpng и libjpeg необходимы необязательным кодом.Они предоставляются в src / 3rdparty, что приводит к конфликтам с версиями библиотек, предоставляемыми системой.Поэтому мы строим без поддержки PNG и JPG.
  • nmake
  • Проверка: статические библиотеки (большие .lib и маленькие .prl) находятся в каталоге lib /
    • 54,7 МБ Qt5Core.lib
    • 23,4 МБ Qt5Widgets.lib
    • 18,2 МБ Qt5Gui.lib
    • 07,4 МБ Qt5Network.lib
    • ...

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

...