Skip to content

13 Март 2012

149

Файловая структура проекта и шаблон .pro файла

qt pro

Статья начинает цикл статей, в которых будут выкладываться готовые шаблоны конфигураций, по которым не составит труда создать свой. Сегодня речь пойдет о файлах проектов Qt, которые обрабатываются программой qmake.

В начале разработки об этом задумываться рано, но когда в вашем проекте несколько выходных .exe и не одна библиотека на входе и на выходе — хочется навести порядок.

:!: Вступление

Файловая структура проекта по-умолчанию — беда. И речь идет даже не обязательно о Qt. Если вы собираетесь провести за этой программой больше недели — обязательно потратьте время чтобы разложить все по полочкам. Мои полочки выглядят так:

/bin_*Выходная папка для первой программы. Сюда попадают готовые .exe и .pdb файлы после сборки (как debug так и release)

/bin_*Выходная папка для второй программа (третьей, четвертой и т.д.)

/buildКаталог сборки. Место для объектных файлов. Причем внутри должно быть разделение для debug и release.

/contribКаталог для исходников отдельных проектов/программ, которые написаны исключительно для помощи разработчикам. Это наши внутренние тулзы.

/depКаталог, в котором собираются все внешние зависимости. То есть библиотеки, написанные третьими лицами. Они могут быть с исходниками, а могут быть и без.

/includeВыходная папка для .h файлов ваших библиотек. И include-папка для вашего приложения, использующего эти библиотеки.

/libВыходная папка для библиотек. Содержит dll, lib, exp файлы. И входная папка библиотек для вашего приложения.

/src/Module1Исходный код

/src/Module2 - Исходный код

/src/CoreИсходный код

/src/* - Исходный код

Шаблоны будут без подробных объяснений. Также будут со временем обновляться, покрывая все больше возможностей.

:!: Шаблон SUBDIRS

TEMPLATE = subdirs

!win32-msvc2003:!win32-msvc2005:!win32-msvc2008:!win32-msvc2010 {
    error("Only win32 MSVS compiler supported!")
}

CONFIG += ordered

SUBDIRS += \
    Module \
    SuperLib \
    MyLib \
    Core

Core.depends += \
    Module \
    SuperLib \
    MyLib

:!: Шаблон APP

TEMPLATE = app

DEBUG_TARGET = FlipBoxd
RELEASE_TARGET = FlipBox

QT       += core gui
CONFIG   += ...
DEFINES += ...

PRECOMPILED_HEADER = stdafx.h

#APPS += ...

###########################
###    LINK DEP LIBS    ###
###########################

#LIBS += -lOle32 -lShell32 -lGdi32

###########################
###   LINK SELF LIBS    ###
###########################

CONFIG(debug, debug|release){
    LIBS += -lModuled -lLibd
}

CONFIG(release, debug|release){
    LIBS += -lModule -lLib
}

INCLUDEPATH += \
    "../../../include" \
    "../"

LIBS += \
    -L"../../../lib/Module" \
    -L"../../../lib/Lib" 

###########################
###    SETUP OUTPUT     ###
###########################

OUTDIR = ../../..

DESTDIR = $$OUTDIR/bin

CONFIG(debug, debug|release){
    TARGET = $$DEBUG_TARGET
}

CONFIG(release, debug|release){
    TARGET = $$RELEASE_TARGET
    CONFIG += console
    DEFINES += QT_NO_DEBUG_OUTPUT
}

#OBJECTS_DIR = $$OUTDIR/build/$$RELEASE_TARGET
#MOC_DIR = $$OUTDIR/build/$$RELEASE_TARGET

###########################
###       SOURCES       ###
###########################

SOURCES += \
    ... \
    ...

OTHER_FILES += \
    ... \
    ...

FORMS += \
    ... \
    ...

RESOURCES += \
    resources.qrc \
    scripts.qrc

## Auto adding .pri files
## Define APP first!
# for(app, APPS) {
#    PATH = $$app
#    include($$PATH/$${app}.pri)
#}

:!: Шаблон LIB

Шаблон повторяет APP. Повторения опущены, показаны только важные детали для шаблона библиотеки.

TEMPLATE = lib
DEFINES += MY_LIB

#CONFIG += static

[...]

###########################
###     SETUP OUTPUT    ###
###########################

OUTDIR = ../../..

win32 {
    OUTINCLUDE = ..\\..\\..\\include
}

[...]

DLLDESTDIR = $$OUTDIR/bin
DESTDIR = $$OUTDIR/lib/$$RELEASE_TARGET

[...]

###########################
###       INSTALL       ###
###########################

header_files.files = $$HEADERS
header_files.path = $$OUTDIR/include/$$RELEASE_TARGET
INSTALLS += header_files

win32 {
    !exists($$OUTINCLUDE\\$$RELEASE_TARGET){
        system(md $$OUTINCLUDE\\$$RELEASE_TARGET)
    }

    for(header, HEADERS) {
        system(copy /y $$header $$OUTINCLUDE\\$$RELEASE_TARGET)
    }
}

:!: Другие возможности qmake

Плюс еще хочу выделить наиболее интересные возможности qmake.

Выполнение любого пользовательского скрипта после завершения компиляции:

QMAKE_POST_LINK += ./MyScript.sh

Обсуждение закрыто.