Название: [РЕШЕНО] Статическая сборка Qt 5.7.0 +mysql +openssl (MSVC 2015 x64) Отправлено: votkayat от Апрель 20, 2017, 17:47 Всем привет.
Пытаюсь собрать статически Qt 5.7.0. Компилятор использую от MS Visual Studio 2015. Сперва собрал openssl 1.0.2k и mysql 5.7. Параметры configure такие: Код: configure.bat -prefix C:\Qt\Qt5.7.0-static -opengl desktop -opensource -confirm-license -nomake examples -nomake tests -debug-and-release -static -static-runtime -no-qml-debug -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -openssl-linked -I C:\lib\openssl\1.0.2k-static64-debug\include -L C:\lib\openssl\1.0.2k-static64-debug\lib -l Gdi32 -l User32 OPENSSL_LIBS="-llibeay32 -lssleay32" -qt-sql-mysql -I C:\lib\mysql\include -L C:\lib\mysql\lib -l mysqlclient Перед сборкой запускаю такой .cmd-файл (как сказано здесь (http://doc.qt.io/qt-5/windows-building.html)): Код: CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 SET _ROOT=C:\Qt\qt-5 SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH% SET QMAKESPEC=win32-msvc2015 SET _ROOT= Несколько часов оно собирается (под виртуальной машиной), потом вываливается с вот такими ошибками: Код: mysqlclient.lib(my_init.obj) : error LNK2019: unresolved external symbol __imp_putenv referenced in function win_init_registry OLDNAMES.lib(putenv.obi) : error LNK2001: unresolved external symbol __imp_putenv mysqlclient.lib(int2str.obj) : error LNK2019: unresolved external symbol __imp_ldiv referenced in function int2str +++++++++++куча других : error LNK2019: unresolved external symbol __imp_[имя функции] ..\..\..\bin\assistant.exe : fatal error LNK1120: 18 unresolved externals Я немного погуглил по этим самым unresolved external symbol, это, вроде как, функции микрософтовской библиотеки C++ (какие-то из них объявлены в stdlib.h, какие-то в string.h, все не искал). При этом, как .h файлы этой библиотеки присутствуют в переменной окружения %INCLUDE%, так и путь к .lib-файлам присутствует в переменной окружения %LIB%. Прошу помощи в решении этой проблемы. Название: Re: Статическая сборка Qt 5.7.0 +mysql +openssl (MSVC 2015 x64) Отправлено: annulen от Апрель 22, 2017, 13:59 Мб -static-runtime поможет (статически линкует рантайм MSVC, потом не требуется vcredist)
Название: Re: Статическая сборка Qt 5.7.0 +mysql +openssl (MSVC 2015 x64) Отправлено: votkayat от Апрель 24, 2017, 12:59 В общем, разобрался путем изучения файла mysqlclient.lib. Оказалось, что при сборке по умолчанию (например, согласно этой (http://www.chriscalender.com/how-to-build-mysql-5-7-on-windows-from-source-code/) статье), он собирается с ключем /MD, что не дает на выходе статическую библиотеку (по крайней мере, в моем ее понимании -- в тонкостях терминов я не силен).
Пересобрал mysql-5.7 с вот такими параметрами: Код: cmake .. -G "Visual Studio 14 2015 Win64" -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=C:\lib\boost -DCMAKE_C_FLAGS_RELWITHDEBINFO="/MT /O2 /Ob1" -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="/MT /O2 /Ob1" После чего уже сам qt-5.7 нормально собрался. Так что проблема была в коряво собранном MySQL. Название: Re: Статическая сборка Qt 5.7.0 +mysql +openssl (MSVC 2015 x64) Отправлено: annulen от Май 06, 2017, 17:02 В общем, разобрался путем изучения файла mysqlclient.lib. Оказалось, что при сборке по умолчанию (например, согласно этой (http://www.chriscalender.com/how-to-build-mysql-5-7-on-windows-from-source-code/) статье), он собирается с ключем /MD, что не дает на выходе статическую библиотеку (по крайней мере, в моем ее понимании -- в тонкостях терминов я не силен). На тип библиотеки флаг /MD не влияет, он определяет тип используемого рантайма. Если статическая библиотека собирается с /MD, то результирующий бинарник будет требовать наличия dll из vcredist на целевой машине, а с /MT - нет. И важно, чтобы все библиотеки в составе одного бинарника имели одинаковый рантайм. Название: Re: [РЕШЕНО] Статическая сборка Qt 5.7.0 +mysql +openssl (MSVC 2015 x64) Отправлено: ЙадоФитый ПлюсЧ от Май 10, 2017, 13:03 Для себя делал кучу батников для быстрой настройки среды и сборки OpenSSL и MySQL
Настройка среды Код
Сборка OpenSSL Код
Сборка MySQL Код
Ну а сама сборка Код
Далее правлю Src\qtbase\mkspecs\common\msvc-desktop.conf Код: QMAKE_CFLAGS_RELEASE = -O2 -MT QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi QMAKE_CFLAGS_DEBUG = -Zi -MTdd Ну и в каталоге сборки Qt выполняю Код
mysql-%Version%\include можно взять в официальном пакете MySQL. А вот на сборке версии для MinGW-W64 я спотыкаюсь на ошибках сборки MySQL и Qt. |