Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: votkayat от Апрель 20, 2017, 17:47



Название: [РЕШЕНО] Статическая сборка 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.