Как указать разные каталоги вывода отладки/выпуска в файле QMake.pro

У меня есть проект Qt, и я хотел бы выводить файлы компиляции вне исходного дерева.

В настоящее время у меня есть следующая структура каталогов:

/
|_/build
|_/mylib
  |_/include
  |_/src
  |_/resources

В зависимости от конфигурации (debug/release) я хотел бы вывести результирующие файлы внутри каталога сборки в каталогах build/debug или build/release.

Как это сделать, используя файл .pro?

Ответ 1

Для моего проекта Qt я использую эту схему в файле *.pro:

HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
           src/dialogs.cpp

Release:DESTDIR = release
Release:OBJECTS_DIR = release/.obj
Release:MOC_DIR = release/.moc
Release:RCC_DIR = release/.rcc
Release:UI_DIR = release/.ui

Debug:DESTDIR = debug
Debug:OBJECTS_DIR = debug/.obj
Debug:MOC_DIR = debug/.moc
Debug:RCC_DIR = debug/.rcc
Debug:UI_DIR = debug/.ui

Это просто, но приятно!:)

Ответ 2

Чтобы изменить каталог для целевой DLL/EXE, используйте это в своем файле pro:

CONFIG(debug, debug|release) {
    DESTDIR = build/debug
} else {
    DESTDIR = build/release
}

Вы также можете изменить каталоги для других целей сборки, таких как объектные и moc файлы (проверьте ссылку на переменную qmake для получения более подробной информации или qmake Ссылка на функцию CONFIG()).

Ответ 3

У меня более компактный подход:

release: DESTDIR = build/release
debug:   DESTDIR = build/debug

OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui

Ответ 4

Я использую тот же метод, предложенный chalup,

ParentDirectory = <your directory>

RCC_DIR = "$$ParentDirectory\Build\RCCFiles"
UI_DIR = "$$ParentDirectory\Build\UICFiles"
MOC_DIR = "$$ParentDirectory\Build\MOCFiles"
OBJECTS_DIR = "$$ParentDirectory\Build\ObjFiles"

CONFIG(debug, debug|release) { 
    DESTDIR = "$$ParentDirectory\debug"
}
CONFIG(release, debug|release) { 
    DESTDIR = "$$ParentDirectory\release"
}

Ответ 5

Правильный способ сделать это - это следующее (спасибо команде поддержки QT):

CONFIG(debug, debug|release) {
    DESTDIR = build/debug
}
CONFIG(release, debug|release) {
    DESTDIR = build/release
}

OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.u

Дополнительная информация здесь: https://wiki.qt.io/Qt_project_org_faq#What_does_the_syntax_CONFIG.28debug.2Cdebug.7Crelease.29_mean_.3F_What_does_the_1st_argument_specify_and_similarly_what_is_the_2nd_.3F

Ответ 6

Старый вопрос, но по-прежнему стоит актуальный ответ. Сегодня он обычно делает то, что делает Qt Creator, когда используются теневые сборки (они включены по умолчанию при открытии нового проекта).

Для каждой целевой цели и типа сборки правильный qmake запускается с правильными аргументами в другом каталоге компоновки. Затем это просто построено с помощью простого make.

Итак, воображаемая структура каталогов может выглядеть так.

/
|_/build-mylib-qt5-mingw32-debug
|_/build-mylib-qt5-mingw32-release
|_/build-mylib-qt4-msvc2010-debug
|_/build-mylib-qt4-msvc2010-release
|_/build-mylib-qt5-arm-debug
|_/build-mylib-qt5-arm-release
|_/mylib
  |_/include
  |_/src
  |_/resources

И в том, что в каталоге сборки выполняется qmake:

cd build-mylib-XXXX
/path/to/right/qmake ../mylib/mylib.pro CONFIG+=buildtype ...

Затем он генерирует make файлы в каталоге build, а затем make также создает файлы под ним. Нет никакого риска смешения разных версий, если qmake никогда не запускается в исходном каталоге (если это так, лучше очистите его!).

И когда это делается, файл .pro из принятого в настоящее время ответа еще проще:

HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
           src/dialogs.cpp

Ответ 7

Также полезно иметь немного другое имя для исполняемого файла. Вы не можете использовать что-то вроде:

release: Target = ProgramName
debug: Target = ProgramName_d

Почему это не работает, не ясно, но это не так. Но:

CONFIG(debug, debug|release) {
    TARGET = ProgramName
} else {
    TARGET = ProgramName_d
}

Это работает, пока предшествует строка CONFIG +=.

Ответ 8

Короткий ответ: вы не.

Вам нужно запустить qmake, а затем make в любом каталоге сборки, который вы хотите построить. Итак, запустите его один раз в каталоге debug, один раз в каталоге release.

То, как кто-то, строящий ваш проект, ожидает, что он будет работать, и то, как сам Qt настроен на сборку, так же, как Qt Creator ожидает, что ваш файл .pro будет вести себя: он просто запускает qmake, а затем make в папке сборки для выбранной вами конфигурации.

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

Это не редкость иметь более двух конфигураций сборки, поэтому вы излишне обязываете себя только дифференцировать сборку и выпуск; у вас могут быть сборки с разными уровнями оптимизации и т.д. Дихотомия отладки/выпуска лучше всего оставить в покое.

Ответ 9

В новой версии Qt Creator также есть опция построения профиля для отладки и выпуска. Вот как я обнаруживаю, что:

CONFIG(debug, debug|release) {  DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else {                          DEFINES += RELEASE_MODE }