Статическая сборка ошибки связи 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.png]()
![e8piC.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, я прошел через
Надеюсь, что это поможет