MT и MD варианты библиотек msvc2010 для работы с одними исходниками

Имеем ситуацию когда вроде бы проект собирается полностью статически и это нам и надо было, но процесс происходит очень долго, почему-то особенно на этапе линковщика ( link). Если собираешь на dll-ках , то процесс идет в разы быстрее.

Для разработчика время не позволительная роскошь.

Поэтому встает вопрос как сделать на одних исходниках Qt (D:\QtSDK1.2.1\QtSources\4.8.1) два варианта сборки : статика для выпуска релиза и динамика( использование dll библиотек) для процесса разработки.

Анализируем код компилятора cl.exe и линковщика link.exe msvc2010 в среде Qt Creator.

Компилятор собирает исходники либо с ключом MD (dll), либо MT (статика).

Для сборки из исходников придется делать два варианта библиотек с MD и с MT ключами сборки, и размещать их в разных каталогах соответсвенно.

Далее в файле pro проекта уже можно будет переключаться на тот или иной каталог библиотек.

Но есть нюанс... Дело в том , что путь к библиотекам Qt прошит прямо в бинарнике qmake.exe(у нас D:\QtSDK1.2.1\QtSources\4.8.1\lib).
Поэтому эту папку придется переименовывать вручную, чтобы Qt не тащил оттуда библиотеки. Либо ее просто очистить - ссылка на папку есть , но там ничего нет.

Далее надо также поступать и со всеми сторонними библиотеками, типа openssl и т.д., то есть делать 2 варианта MD (dll) и MT (lib).

Но есть еще нюанс! Чтобы иметь возможность делать две сборки на основе исходников Qt удобнее настраивать пути к разным вариантам подключения сторонних библиотек (например openssl) не глобально для всех исходников через утилиту config.exe , а лучше настраивать напрямую в только в проекте network.pro подключение нужных файлов от openssl. Так как openssl у нас будет использоваться только в network проекте.

То есть если нам надо динамику в network.pro делаем так :

INCLUDEPATH += D:\\OpenSSL\\1_0_0_1\\include\\
DEPENDPATH += D:\OpenSSL\1_0_0_1\bin

Если надо статику (MT) делаем так :

INCLUDEPATH += D:\\OpenSSL\\1_0_0_1\\include\\
LIBS += -LD:\OpenSSL\1_0_0_1\lib -llibeay32 -lssleay32

Это дает просто удобство - не надо пересобирать все исходники (D:\QtSDK1.2.1\QtSources\4.8.1\src) , а можно только ветку network.pro, что очень экономит время.

Но есть еще один нюанс! собираем динамику и ловим ошибки , причем это видно только в терминале , когда программа запускается :

QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_erro

Оказывается libeay32.dll и ssleay32.dll у нас присутствуют в каталоге D:\QtSDK1.2.1\QtCreator\bin и версия из 0.9.8.14 .

Также библиотеки libeay32.dll и ssleay32.dll присутсвует в каталоге C:\Windows\SysWOW64.

Откуда программа подцепит при запуске эти библиотеки - это просто лотерея, так как на разных компьютерах ситуация разная. Можно глобально поискать эти библиотеки по всем каталогам и вы наверняка найдете их еще не одну.

фотка 1

А у нас наши собранные библиотеки openssl версии 1.0.1.21 (версия продукта 1.0.1u) лежат в каталоге D:\OpenSSL\1_0_0_1\bin .

И самый простой способ решить проблему это скопировать из D:\QtSDK1.2.1\QtCreator\bin libeay32.dll и ssleay32.dll в каталог , где собирается наша программа.

Вот почему мы собираем наши продукты конечным пользователям только статичеки (без зависимосте к разным dll).