Статическая сборка ошибки связи Qt Qt5Network

Я пытаюсь сделать статическую сборку Qt (версия 5.4.1) с поддержкой OpenSSL. Я настроил его следующим образом:

configure -opensource -release -c++11 -static -platform win32-msvc2013 
-openssl-linked  -I C:\OpenSSL-Win32\include 
-L C:\OpenSSL-Win32\lib\VC\static
-nomake examples -nomake tests

Включаются каталоги include и lib. Я получаю множество ошибок связывания в Qt5Network.lib.

Qt5Network.lib(qhttpnetworkconnectionchannel.obj) : error LNK2019: unresolved ex
ternal symbol "public: static class QSharedPointer<class QSslContext> __cdecl QS
slSocketPrivate::sslContext(class QSslSocket *)" ([email protected]@
@[email protected]@@@@[email protected]@@Z) referenced in function
 "protected: void __thiscall QHttpNetworkConnectionChannel::_q_connected(void)"
([email protected]@@IAEXXZ)
Qt5Network.lib(qhttpprotocolhandler.obj) : error LNK2019: unresolved external sy
mbol "public: __int64 __thiscall QSslSocket::encryptedBytesToWrite(void)const "
([email protected]@@QBE_JXZ) referenced in function "private: vi
rtual bool __thiscall QHttpProtocolHandler::sendRequest(void)" ([email protected]
[email protected]@EAE_NXZ)
C:\Qt\5.4\qtbase\bin\xmlpatterns.exe : fatal error LNK1120: 31 unresolved extern
als
jom: C:\Qt\5.4\qtxmlpatterns\tools\xmlpatterns\Makefile [release] Error 2
jom: C:\Qt\5.4\qtxmlpatterns\tools\Makefile [sub-xmlpatterns-make_first] Error 2

jom: C:\Qt\5.4\qtxmlpatterns\Makefile [sub-tools-make_first] Error 2
jom: C:\Qt\5.4\Makefile [module-qtxmlpatterns-make_first] Error 2

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

Есть ли у кого-нибудь идея решить эту проблему?

UPDATE

Эти конфигурации создают ту же ошибку:

Конфигурация 1:

configure -opensource -release -c++11 -static -platform win32-msvc2013 
-openssl-linked  -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32\lib\VC\static
 OPENSSL_LIBS="-llibeay32MT -lssleay32MT" -nomake examples -nomake tests

Конфигурация 2:

configure -opensource -release -c++11 -static -platform win32-msvc2013 
-openssl  -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32
-nomake examples -nomake tests

ОБНОВЛЕНИЕ 2

Я также пробовал так следовать великолепному учебнику в qBittorrent wiki и получил те же ошибки.

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

ОБНОВЛЕНИЕ 3

Вкл bugreports.qt.io Я получил мнение, что это не ошибка:

На самом деле вы не сказали сборке связывать библиотеки openssl. http://doc.qt.io/qt-5/ssl.html дает следующий пример:

OPENSSL_LIBS = '- L/opt/ssl/lib -lssl -lcrypto'./configure -openssl-сшитый

Вам нужно будет настроить его для своих мест компилятора и библиотеки Конечно.

На указанной странице документации приведен пример:

OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl-linked

Я не нахожу ssl или крипто библиотеки в сборке OpenSSL, которую я скомпилировал, ни в двоичном дистрибутиве. Однако у меня есть заголовки. У меня есть только библиотеки ssleay32 и libeay32.

Команда configure делает намек на то, чтобы установить эти библиотеки в указанную переменную:

NOTE: When linking against OpenSSL, you can override the default
library names through OPENSSL_LIBS
and optionally OPENSSL_LIBS_DEBUG/OPENSSL_LIBS_RELEASE
For example:
    configure -openssl-linked OPENSSL_LIBS="-lssleay32 -llibeay32"

Установив эту переменную, я все равно получаю те же ошибки.

ОБНОВЛЕНИЕ 5

Не то, что я хотел, но шаг вперед:

Я загрузил источники для недавно выпущенного Qt 5.4.2 (4 дня назад), и с этим мне удалось создать статическую сборку с динамически подключенным OpenSSL (-openssl switch).

Я все еще ищу решение для статической ссылки OpenSSL. У меня все еще есть те же ошибки связывания.

Ответ 1

Вот как я строю Qt 5.7.1 с поддержкой SSL и MySQL в Windows с помощью MSVC 2013

Убедитесь, что Perl, Python и Ruby можно найти в переменной среды PATH.

Загрузите Qt из репозитория github:

cd C:\Qt
git clone https://github.com/qt/qt5.git
cd C:\Qt\qt5 
git checkout 5.7 

Обязательно зарегистрируйте фиксацию 36e7cff94fbb4af5d8de6739e66164c6e6873586. В это время проверка 5.7 делает именно это.

Поместите содержимое ниже в qt5vars.bat, расположенном в C:\Qt\qt5. Внесите коррективы, если вам нужно:

@echo off

REM Set up \Microsoft Visual Studio 2015, where <arch> is \c amd64, \c x86, etc.
CALL "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86

REM Edit this location to point to the source code of Qt
SET _ROOT=C:\Qt\qt5

SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH%

REM Uncomment the below line when using a git checkout of the source repository
SET PATH=%_ROOT%\qtrepotools\bin;%PATH%

REM Uncomment the below line when building with OpenSSL enabled. If so, make sure the directory points
REM to the correct location (binaries for OpenSSL).
SET PATH=C:\OpenSSL-Win32\bin;%PATH%

REM When compiling with ICU, uncomment the lines below and change <icupath> appropriately:
REM SET INCLUDE=<icupath>\include;%INCLUDE%
REM SET LIB=<icupath>\lib;%LIB%
REM SET PATH=<icupath>\lib;%PATH%

REM Contrary to earlier recommendations, do NOT set QMAKESPEC.

SET _ROOT=

REM Keeps the command line open when this script is run.
cmd /k

После этого выполните этот файл и правильно запустите репозиторий:

qt5vars.bat 
perl init-repository

Наконец, чтобы успешно сконфигурировать и скомпилировать библиотеку (с версиями отладки и выпуска), убедитесь, что пути, на которые ссылается configure, также действительны в вашей системе:

configure -static -static-runtime -debug-and-release -ssl -openssl -openssl-linked -qt-sql-mysql -opengl dynamic -platform win32-msvc2013 -prefix C:\Qt\qt5.7-msvc2013-static -nomake tests -nomake examples -I "C:\Program Files (x86)\MySQL\MySQL Connector.C 6.1\include" -I "C:\OpenSSL-Win32\include" -L "C:\Program Files (x86)\MySQL\MySQL Connector.C 6.1\lib" -L "C:\OpenSSL-Win32\lib\VC\static" OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32 -lCrypt32" OPENSSL_LIBS_DEBUG="-lssleay32MTd -llibeay32MTd" OPENSSL_LIBS_RELEASE="-lssleay32MT -llibeay32MT"
nmake
nmake install

Все до сих пор должно было проходить гладко и красиво. Теперь нужно настроить Qt Creator на обнаружение этой новой версии Qt и создать новый набор для использования в ваших проектах:

1H91c.pnge8piC.png

Ответ 2

Я как-то заставил работать довольно быстро с Qt 5.3 некоторое время назад:

configure -static -debug-and-release -platform win32-msvc2012-mt -openssl -I %OPENSSL_HOME%\include -L %OPENSSL_HOME% -nomake examples -nomake tests -confirm-license -opengl es2 -skip qtwebkit -skip qtwebkit-examples -skip qttools

Где -платформа win32-msvc2012-mt указывает на параметр -MT компилятора optionpecpec, поэтому приложение также использует MT. Кроме того, чтобы все это работало в файле .pro:

LIBS += -L$$PWD/../third-party/openssl/lib -llibeay32MT
LIBS += -L$$PWD/../third-party/openssl/lib -lssleay32MT

Обязательно переустановите всю директорию Qt Src между статическими попытками сборки Qt, из моего наблюдения всегда трудно отслеживать остатки, которые разбивают все на новый прогон.

И переменная OPENSSL_HOME установлена ​​в ProjectDir\third-party\openssl

Ответ 3

Я потратил около одного дня на эту статическую сборку, и для меня это работает:

https://github.com/alberthdev/alberthdev-misc/wiki/Building-Qt-v5.6-Statically-on-Windows

Кроме того, вы должны заметить, что я использовал openssl-1.0.1r, beacuse new version build algorithm и .dll имена отличаются друг от друга по порядку, поэтому alghorithm команды не работает с ними, openssl-1.0.1r не устарел, поэтому он это нормально.

Кроме того, у меня были проблемы с build.bat script, поэтому вот тот, который работал у меня в режиме propper:

   ..\qt-5.8.0\configure -opensource -confirm-license^
   -prefix C:\Qt\Qt5.8.0-static^
   -debug-and-release -ssl -openssl -openssl-linked -opengl dynamic^
   -static -static-runtime -platform win32-msvc2015^
   -no-compile-examples -nomake examples^
    -L C:\OpenSSL-win32\lib -I C:\OpenSSL-win32\include OPENSSL_LIBS="-llibeay32 -lssleay32"

Обратите внимание, что мой "Build" dir был из "qt-5.8.0", поэтому, пожалуйста, исправьте путь ..\qt-5.8.0\configure, чтобы он соответствовал вашему филе. Все остальные шаги были сделаны деффенетично, как сказано в инструкции по ссылке.

Ответ 4

Это старый вопрос, но я бы ответил, что это зависит от версии open ssl. Если вы используете версию ниже 1.1.0, приведенная выше последовательность может быть в порядке, однако при использовании 1.1.1 из моего опыта не требуется OPENSSL_LIBS = "-LC:\OpenSSL-Win32\lib -lssl -LC rypto". Когда настроено, есть элемент с именем QtNetowrk, который показывает, была ли обнаружена библиотека openssl. Следующее работает с 1.1.1 static и qt 5.12.4

set OPENSSL_HOME=C:\OpenSSL-Win32

..\configure -static -debug-and-release -platform win32-msvc2019 -static-runtime -ssl -openssl -openssl-linked -I %OPENSSL_HOME%\include -L %OPENSSL_HOME%\lib

Ответ 5

Я столкнулся с той же проблемой, и я думаю, что проблема заключается в том, что мы создаем без ssl сначала, а src/network/Makefiles не восстанавливаются

Когда я удалил их и снова запустил configure, я прошел через

Надеюсь, что это поможет