msvc2010 статик ,опции cl -MD или -MT

Итак когда кажется ,что проект 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. Так традиционно называют переменную в MaleFile с ключами для компилятора .

Собираем 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 тоже пропала!