Вторая попытка собрать libQtCore.a

Итак берем и собираем libQtCore.a под Windows на Qt 4.8.1.

Сначала устанавливаем SDK для разработки с галочкой OpenSource из QtSdk-offline-win-x86-v1_2_1.exe.

В результате получим исходники QT в каталоге C:\QtSDK1.2.1\QtSources\4.8.1. Исходники собираются из проекта src.pro , который находится в каталоге C:\QtSDK1.2.1\QtSources\4.8.1\src .

Для начала надо установить глобальные переменные для Qt. Делается это с помощью config.exe , который находится в каталоге C:\QtSDK1.2.1\QtSources\4.8.1. configure.exe практическое использование.

В результате в этом же каталоге появится файл .qmake.cache , где и будут прописаны первоначальные базовые переменные. .qmake.cache будет использоваться всеми проектами ниже по дереву каталогов (так работает qmake.exe).

Важно понимать , что есть переменные первого уровня, которые вшиты прямо в бинарник qmake.exe и которые мы не может естественно поменять (переменные 1 уровня) . Это те переменные , которые появляются при наведении мышки на объект профиля :

фотка 1

Это например QT_INSTALL_LIBS , которые используются в некоторых .pro проектах ниже.

В файле .qmake.cache добавляются еще переменные (назовем из переменные 2 уровня) : QT_BUILD_TREE , QT_SOURCE_TREE

OBJECTS_DIR     = tmp/obj/release_static
MOC_DIR         = tmp/moc/release_static
RCC_DIR         = tmp/rcc/release_static
styles         += windows cleanlooks windowsxp windowsvista cde
TMPPATH            = $$quote($$(INCLUDE))
QMAKE_INCDIR_POST += $$split(TMPPATH,";")
TMPPATH            = $$quote($$(LIB))
QMAKE_LIBDIR_POST += $$split(TMPPATH,";")
CONFIG         += minimal-config small-config medium-config large-config full-config release incremental msvc_mp create_prl link_prl depend_includepath QTDIR_build
QT_BUILD_PARTS  = libs tools examples demos docs translations
QMAKESPEC       = C:/QtSDK1.2.1/QtSources/4.8.1/mkspecs/win32-g++
ARCH            = windows
QT_BUILD_TREE   = C:/QtSDK1.2.1/QtSources/4.8.1
QT_SOURCE_TREE  = C:/QtSDK1.2.1/QtSources/4.8.1
QMAKE_MOC       = $$QT_BUILD_TREE/bin/moc.exe
QMAKE_UIC       = $$QT_BUILD_TREE/bin/uic.exe
QMAKE_UIC3      = $$QT_BUILD_TREE/bin/uic3.exe
QMAKE_RCC       = $$QT_BUILD_TREE/bin/rcc.exe
QMAKE_DUMPCPP   = $$QT_BUILD_TREE/bin/dumpcpp.exe
QMAKE_INCDIR_QT = $$QT_BUILD_TREE/include
QMAKE_LIBDIR_QT = $$QT_BUILD_TREE/lib

QMAKE_LIBDIR_QT - это каталог куда будет собираться наша библиотека libQtCore.a (и остальные если понадибится). Изначально этот каталог пустой.

Открываем проект src.pro через Qt Creator , делаем qmake, делаем сборку и каталоге C:\QtSDK1.2.1\QtSources\4.8.1\lib появляется наш libQtCore.a.

Важно - НЕ делать теневую сборку! Это намного упростит задачу.

Теперь мы хотим создать на основе libQtCore.a наше первое консольное приложение. Как и где мы это делаем?...

Имеет смысл сделать наше приложение частью исходников Qt, то есть прямо в каталоге C:\QtSDK1.2.1\QtSources\4.8.1\src. Из нашего приложения просто делаем include(./src.pro) и зависимость от исходников у нас есть.

QT       += core
QT       -= gui

TARGET = my
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

include(./src.pro)

SOURCES += main.cpp

Делаем сборку, завершается успешно :

17:22:02: Выполняется сборка проекта my...

g++ -c -O2 -fexceptions -mthreads -Wall -fno-rtti -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NO_DYNAMIC_CAST -I"..\..\include\QtCore" -I"..\..\include" -I"..\..\include\ActiveQt" -I"tmp\moc\release_static" -I"..\my" -I"." -I"c:\QtSDK1.2.1\Desktop\Qt\4.8.1\mingw\mkspecs\win32-g++" -o tmp\obj\release_static\main.o ..\my\main.cpp

g++ -Wl,-s -Wl,-subsystem,console -mthreads -o release\my.exe tmp/obj/release_static/main.o  -L"c:\QtSDK1.2.1\QtSources\4.8.1\lib" -L"c:\QtSDK1.2.1\QtSources\4.8.1\lib" -lQtCore -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 -LC:/QtSDK1.2.1/QtSources/4.8.1/lib_my 

Наш новый проект (приложение my) нормально сбоирается с библиотекой libQtCore.a смотрите : -L"c:\QtSDK1.2.1\QtSources\4.8.1\lib" -lQtCore .

При этом очень важно , что libQtCore.a заново не пересобирается (кстати этоот процесс доволно длительный). Собирается только наше приложение my.exe. В этом и есть главный смысл qmake / make / makefile - пересобирвать модули только если в них были внесены изменения.

Теперь понятно как дальше создавать свои проекты из исходников Qt.

Примечание: Для сборки отладочной версии не забудьте сделать config.exe с параметрами -debug-and-release и -declarative-debug . После сборки появится libQtCored.a (послдедняя буква d в имени libQtCored означает debug ) в C:\QtSDK1.2.1\QtSources\4.8.1\lib .

Теперь переходим к изучению какие исходники компилировались по порядку (в нашем минимальном проекте), ибо там их немеренно.

Примечание: файл my.exe получился 2Кб в релиз версии.