Итак когда кажется ,что проект Qt собрался статически , а на самом деле это не так. Точнее частично статически , а частично не статически. Как такое возможно?...
На практике было так : QtCored.lib и другие библиотек самой Qt нормально собрались статически, то есть зависимостей от QtCored.dll,... не осталось.
Но вот внешне подключаемые библиотеки libeay32.lib и ssleay32.lib как-то странно себя ведут. На самом деле зависимость от libeay32.dll, ssleay32.dll остается , то есть программа их требует при запуске. Как такое возможно?....
Идет пересборка QT библиотек из исходников. Вот небольшой кусок часть сборки, работает nmake.exe:
cl -c -nologo -Zm200 -Zc:wchar_t- -O2 -MD -MP -GR -EHsc -GL -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_BOOTSTRAPPED -DQT_LITE_UNICODE -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CODECS -DQT_NO_DATASTREAM -DQT_NO_GEOM_VARIANT -DQT_NO_LIBRARY -DQT_NO_QOBJECT -DQT_NO_STL -DQT_NO_SYSTEMLOCALE -DQT_NO_TEXTSTREAM -DQT_NO_THREAD -DQT_NO_UNICODETABLES -DQT_NO_USING_NAMESPACE -DQT_NO_DEPRECATED -DQT_NODLL -I"d:\OpenSSL\1_0_0_1\include" -I"..\..\..\include" -I"..\..\..\include\QtCore" -I"..\..\..\include\QtXml" -I"..\..\3rdparty\zlib" -I"..\..\..\mkspecs\win32-msvc2010" -Fotmp\obj\release_static\
cl это компилятор cl.exe.
Опция -MD указывает на сборку с использованием в дальнейшем библиотек как dll варианта.
Вариант -MT как раз наоборот указывает собирать статически , то есть пихать все функции в один результирующий exe-шник. Но где это можно поменять ?
nmake.exe не является частью Qt , это сборщик проектов от Microsoft и является частью Visual Studio например, но не только.
Располагается nmake.exe "много-вариантно" например в таких папках :
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
Пришлось даже глобально по всем файлам поискать ключ MD ... И ничего вразумительного не было найдено... CFLAG тоже не нашли.
Примечание : ключ MD или MT надо искать рядом со словом CFLAG. Так традиционно называют переменную в MakeFile с ключами для компилятора .
Собираем Qt с ключом -MT
Поэтому ключ -MT решили устанавливать по другому. То есть не запуская nmake.exe из командной строки, а другим способом через Qt Creator .
Но сначала открываем каталог D:\QtSDK1.2.1\Desktop\Qt\4.8.1\msvc2010\mkspecs\win32-msvc2010 и находим файл qmake.conf. Именно здесь оказывается изменяются ключи компилятора :
#QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_RELEASE = -O1 -MT
#QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -O2 -MD -Zi
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -O1 -MT -Zi
#QMAKE_CFLAGS_DEBUG = -Zi -MDd
QMAKE_CFLAGS_DEBUG = -Zi -MTd
После этого открываем Qt Creator , делаем Clean All , потом Run QMake и далее пересобираем все исходники Qt:
cl -c -FIqt_pch.h -Yuqt_pch.h -Fptmp\obj\debug_static\QtCored_pch.pch -nologo -Zm200 -Zc:wchar_t- -Zi -MTd -W3 -w34100 -w34189 -MP -GR -EHsc -DQT_THREAD_SUPPORT -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_BUILD_CORE_LIB -DQT_NO_USING_NAMESPACE -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -D_USE_MATH_DEFINES -DQLIBRARYINFO_EPOCROOT -DHB_EXPORT=Q_CORE_EXPORT -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -I"..\..\include" -I"d:\OpenSSL\1_0_0_1\include" -I"..\..\include\QtCore" -I"tmp\rcc\debug_static" -I"tmp" -I"global" -I"..\..\tools\shared" -I"..\3rdparty\zlib" -I"..\3rdparty\harfbuzz\src" -I"..\3rdparty\md5" -I"..\3rdparty\md4" -I"..\..\include\ActiveQt" -I"tmp\moc\debug_static" -I"d:\QtSDK1.2.1\Desktop\Qt\4.8.1\msvc2010\mkspecs\win32-msvc2010" -Fotmp\obj\debug_static\ @C:\Users\p\AppData\Local\Temp\qstringbuilder.obj.12240.12703.jom
Видно , что -MT здесь уже нормально присутствует (-MTd это отладочный вариант сборки).
Собираем исходники openssl с ключом -MT
Теперь логично задуматься - как собираются исходники libeay32.lib и ssleay32.lib? С каким ключом?...
Оказывается тут надо использовать nt.mak вместо ntdll.mak . В этом и была изначально ошибка, смутило то , что файлы на выходе получались одинаковые *.lib , поэтому показалось , что это статические библиотеки:
@set path=D:\PROG\NASM;%PATH%
cd D:\OpenSSL\openssl-1.0.1u
perl Configure VC-WIN32 --prefix=d:\OpenSSL\1_0_1
ms\do_ms
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
cd d:\openssl-1.0.0d
::nmake -f ms\ntdll.mak
nmake -f ms\nt.mak
::nmake -f ms\ntdll.mak install
nmake -f ms\nt.mak install
Вот теперь openssl собирается как надо с ключом /MT:
cl /Fotmp32\bn_recp.obj -Iinc32 -Itmp32 /MT /Ox /O2 /Ob2 -DOPENSSL_THREADS -DDSO_WIN32 -W3 -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_SSL2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_WEAK_SSL_CIPHERS -DOPENSSL_NO_DYNAMIC_ENGINE /Zl /Zi /Fdtmp32/lib -c .\crypto\bn\bn_recp.c
bn_recp.c
Примечание: возможно показалось, но ключ оптимизации должен быть один например -O2 (и в Qt сборке и у openssl).
Короче говоря зависимость от libeay32.dll и ssleay32.dll ушла!
Теперь проекты нормально собираются. И даже отлаживаются хотя debug варианта openssl библиотек не делали.
И кстати попутно выясняется еще, что и зависимость от msvcp100.dll и msvcr100.dll тоже пропала!