Название: [РЕШЕНО] Статическая сборка 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 Настройка среды DOS @echo off echo Setting up environment... if "%1" == "" goto x86 if "%1" == x86 goto x86 if "%1" == x64 goto x64 :x86 set PERL=<Path_To_Perl_32>\bin\ set PYTHON=<Path_To_Python_32>\ set RUBY=<Path_To_Rubi_32>\bin\ set NASM=<Path_To_NAsm_32>\ set CMAKE=<Path_To_CMake_32>\bin\ goto usage :x64 set PERL=<Path_To_Perl_64>\bin\ set PYTHON=<Path_To_Python_64>\ set RUBY=<Path_To_Rubi_64>\bin\ set NASM=<Path_To_NAsm_64>\ set CMAKE=<Path_To_CMake_64>\bin\ goto usage :usage set PATH=%PERL%;%PYTHOM%;%RUBY%;%NASM%;%CMAKE%;%PATH%
Сборка OpenSSL DOS echo Build OpenSSL set OPENSSLSRC=<Path_To_OpenSSL_SRC>\ set OPENSSLINSTALL=<Path_Where_Will_Be_Installes_OpenSSL_Builds>\ cd %OPENSSLSRC% set LNKD=Shared set DMG=Release if "%1" == "" goto x86 if "%1" == x86 goto x86 if "%1" == x64 goto x64 goto x86 :x86 set_vs_evn.bat x86 set VCARCH=VC-WIN32 set ORCH=32 goto testdebug :x64 set_vs_evn.bat x64 set VCARCH=VC-WIN64A set ORCH=64 goto testdebug :testdebug if "%2" == "" goto teststatic if "%2" == "/release" goto teststatic if "%2" == "/debug" goto makedebug if "%2" == "release" goto teststatic if "%2" == "debug" goto makedebug if "%3" == "" goto teststatic if "%3" == "/release" goto teststatic if "%3" == "/debug" goto makedebug if "%3" == "release" goto teststatic if "%3" == "debug" goto makedebug goto teststatic :makedebug set VCARCH=debug-%VCARCH% set DMG=Debug goto teststatic :teststatic if "%2" == "" goto configure if "%2" == "/shared" goto configure if "%2" == "/static" goto makestatic if "%2" == "shared" goto configure if "%2" == "static" goto makestatic if "%3" == "" goto configure if "%3" == "/shared" goto configure if "%3" == "/static" goto makestatic if "%3" == "shared" goto configure if "%3" == "static" goto makestatic goto configure :makestatic set LNKD=Static goto configure :configure perl Configure %VCARCH% --prefix=%OPENSSLINSTALL%\OpenSSL_%ORCH%_%LNKD%_%DMG% ms\do_ms if "%LNKD" == "Shared" goto sharedbuild if "%LNKD" == "Static" goto staticbuild goto sharedbuild :sharedbuild nmake -f ms\ntdll.mak nmake -f ms\ntdll.mak install goto :eof :staticbuild nmake -f ms\nt.mak nmake -f ms\nt.mak install goto :eof
Сборка MySQL DOS echo Build MySSL set MYSQLSRC=<Path_To_MySQL_SRC>\ set BOOSTSRC=<Path_To_BOOST_SRC>\ set BUILDROOT=<Path_For_Build_MySQL>\ cd %BUILDROOT% if "%1" == "" goto x86 if "%1" == x86 goto x86 if "%1" == x64 goto x64 goto x86 :x86 set_vs_evn.bat x86 set VCARCH="Visual Studio 14 2015" set ORCH=32 goto testdebug :x64 set_vs_evn.bat x64 set VCARCH="Visual Studio 14 2015 Win64" set ORCH=64 goto testdebug :testdebug if "%2" == "" goto makerelease if "%2" == "/release" goto makerelease if "%2" == "release" goto makerelease if "%2" == "/debug" goto makedebug if "%2" == "debug" goto makedebug goto makerelease :makedebug set DMG=Debug goto configureandbuild :makerelease set DMG=Release goto configureandbuild :configureandbuild mkdir %BUILDROOT%\MySQL_%ORCH%_%DMG% cd %BUILDROOT%\MySQL_%ORCH%_%DMG% cmake %MYSQLSRC% -G %VCARCH% -DWITH_BOOST=%BOOSTSRC% devenv.com MySQL.sln /build %DMG% goto :eof
Ну а сама сборка DOS set_common_evn.bat "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 D: cd D:\ build_OpenSSL.bat x64 release static build_OpenSSL.bat x64 debug static cd <Path_Where_Will_Be_Installes_OpenSSL_Builds>\OpenSSL_x86_Static_Debug_VisualStudio\lib REN libeay32.lib libeay32D.lib REN ssleay32.lib ssleay32D.lib cd D:\ build_MySQL.bat x64 release
Далее правлю 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 выполняю DOS ..\..\Src\configure.bat -static -debug-and-release -platform win32-msvc2015 -c++std c++11 -prefix "..\..\..\..\..\Qt\5.7\msvc2015_x64_static" -opensource -confirm-license -nomake examples -nomake tests -make tools -qml-debug -opengl dynamic -system-proxies -make libs -qt-pcre -qt-libpng -qt-libjpeg -qt-zlib -qt-freetype -qt-sql-sqlite -qt-sql-odbc -qt-sql-mysql -openssl -openssl-linked OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32" OPENSSL_LIBS_RELEASE="-llibeay32MT -lssleay32MT" OPENSSL_LIBS_DEBUG="-llibeay32MTd -lssleay32MTd" -l mysqlclient -I "<mysql-%Version%\include>l" -I "<Path_Where_Will_Be_Installes_OpenSSL_Builds>\OpenSSL_x86_Static_Release_VisualStudio\lib\include" -L "<Path_For_Build_MySQL>\libmysql\Release" -L "<Path_Where_Will_Be_Installes_OpenSSL_Builds>\OpenSSL_x86_Static_Debug_VisualStudio\lib" -L "<Path_Where_Will_Be_Installes_OpenSSL_Builds>\OpenSSL_x86_Static_Relesa_VisualStudio\lib" -L "c:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64" nmake /nologo nmake /nologo install
mysql-%Version%\include можно взять в официальном пакете MySQL. А вот на сборке версии для MinGW-W64 я спотыкаюсь на ошибках сборки MySQL и Qt.
|