Как настроить две версии сборки static и shared из одних исходников Qt

фотка 1

Короче это оказывается возможно. Но что это дает? Значит так : разрабатываем Qt приложение . В динамике сборка идет в разы быстрее.

Когда надо выпустить приложение в свет божий делаем статику. В результате : никаких зависимостей от библиотек *.dll у пользователя не будет . Просто один exe-ник распространяем и все.

Все делается на одном проекте , на одних исходниках.

Но саму среду разработки (QtSDK) устанавливаем дважды (с исходниками QtSources).

То есть сами библиотеки Qt собираются в двух разных ветках диска. Одни библиотеки будут статическими (MT MTd) , другие динамические (на dll MD MDd).

На чем работаем, наши инструменты :

QtSDK1.2.1
Qt 4.8.1 исходники
Qt Creator 2.4.1
msvc2010 для Windows.

фотка 2

Конфигурируем сборки исходников , запускаем config.exe

Первые исходники пусть будут собраны статически :

configure.exe -opensource -confirm-license -debug-and-release -mp -platform win32-msvc2010 -nomake examples -nomake demos -nomake test -no-qt3support -no-scripttools -no-opengl -no-phonon -no-style-motif -no-style-cde -no-style-cleanlooks -no-style-plastique -no-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -static -openssl -openssl-linked -ltcg OPENSSL_LIBS="-llibeay32 -lssleay32" -I D:\OpenSSL\1_0_0_1\include -L D:\OpenSSL\1_0_0_1\lib -no-qmake -dont-process

Вторые исходники будут "разделяемые" shared :

configure.exe -opensource -confirm-license -debug-and-release -mp -platform win32-msvc2010 -shared -nomake examples -nomake demos -nomake tests -no-qt3support -no-scripttools -no-opengl -no-phonon -no-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -openssl OPENSSL_LIBS="-llibeay32 -lssleay32" -I D:\OpenSSL\1_0_0_1\include -I D:\OpenSSL\1_0_0_1\bin -no-qmake -dont-process

qmake.conf

У первых исходников qmake.conf должен содержать:

QMAKE_CFLAGS_RELEASE    = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG      = -Zi -MTd

У вторых исходников в qmake.conf должны быть указаны другие ключи компилятора:

QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG      = -Zi -MDd

Далее для каждого варианта исходников заходим в каталог src и открываем src.pro в Qt Creator. Собирается , долго , может пару часов.

В результате в каталогах lib появляются нужные нам библиотеки.

Далее создаем или открываем свой проект в Qt Creator. Ваш проект уже может находится в любом месте , на любом диске , неважно где , то есть он НЕ привязан к каталогу исходников Qt.

Единственно , что надо сделать в своем проекте это не забыть добавить ваши варианты qmake.exe на закладке Qt Versions:

фотка 3

Теперь уже можно собирать, но все-таки лучше настроить сборку в pro файле таким образом, чтобы было бы легче переключаться между вариантами сборки :



TEMPLATE = app

QT += core network gui

CONFIG +=  console gui

CONFIG   += openssl

CONFIG += release static
CONFIG -= debug shared

contains(CONFIG, static){
    message(!!!! static)
    CONFIG( release, release|debug){
        out_dir=release_static
        message($$out_dir)
        CONFIG   += openssl-linked
        INCLUDEPATH += D:\OpenSSL\1_0_0_1\include
        LIBS += -LD:\OpenSSL\1_0_0_1\lib -llibeay32 -lssleay32
        QMAKE_LFLAGS_EXCEPTIONS_ON -= -mthreads
    }
    CONFIG(debug, debug|release){
        out_dir=debug_static
        message($$out_dir)
        INCLUDEPATH += D:\OpenSSL\1_0_0_1\include
        LIBS += -LD:\OpenSSL\1_0_0_1\lib -llibeay32 -lssleay32
    }
}
else{
    message(!!!! shared)
    CONFIG(release, release|debug){
        out_dir=release_shared
        message($$out_dir)
        INCLUDEPATH += D:\OpenSSL\1_0_0_1dll\include
        LIBS += -LD:\OpenSSL\1_0_0_1dll\lib -llibeay32 -lssleay32
    }
    CONFIG(debug, debug|release){
        out_dir=debug_shared
        message($$out_dir)
        INCLUDEPATH += D:\OpenSSL\1_0_0_1dll\include
        INCLUDEPATH += D:\OpenSSL\1_0_0_1dll\bin
        LIBS += -LD:\OpenSSL\1_0_0_1dll\lib -llibeay32 -lssleay32
        dlls.path  =  $$OUT_PWD/debug
        dlls.files += D:\OpenSSL\1_0_0_1dll\bin\libeay32.dll
        dlls.files += D:\OpenSSL\1_0_0_1dll\bin\ssleay32.dll
        #dlll.CONFIG = no_check_exist
        INSTALLS   += dlls
    }
}

Тут по сути 4 варианта сборки , так как их реально 4 получается. Но нас интересуют варианты, которые указываются так :

Статика (падает в каталог release):

CONFIG += release static
CONFIG -= debug shared

Теперь меняем и получаем динамику (падает в каталог debug):

CONFIG -= release static
CONFIG += debug shared

Самое интересное , что все это работает!

Примечание : также проверено, что сторонние openssl (1.0.1) библиотеки подключаются и работают корректно.

Но оказывается, что можно сделать еще проще: сборка static и shared из одних исходников.