Как указать разные выходные каталоги Debug / Release в файле QMake .pro - PullRequest
100 голосов
/ 06 апреля 2010

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

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

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

В зависимости от конфигурации (отладка / выпуск), я хочу вывести получившиеся файлы в каталог сборки в каталогах build / debug или build / release.

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

Ответы [ 9 ]

143 голосов
/ 06 апреля 2010

Для моего проекта 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

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

49 голосов
/ 06 апреля 2010

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

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

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

40 голосов
/ 13 октября 2012

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

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

OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui
13 голосов
/ 17 июня 2010

Я использую тот же метод, который предложил 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"
}
12 голосов
/ 09 ноября 2015

Правильный способ сделать это заключается в следующем (спасибо команде поддержки 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

10 голосов
/ 05 апреля 2014

Старый вопрос, но все еще стоит актуальный ответ. Сегодня принято делать то, что делает 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-файлы в директории сборки, а затем make также генерирует файлы под ним. Нет риска перепутать разные версии, если qmake никогда не запускается в исходном каталоге (если он есть, лучше очистите его!).

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

HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
           src/dialogs.cpp
3 голосов
/ 07 апреля 2016

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

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

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

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

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

3 голосов
/ 29 октября 2013

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

release: Target = ProgramName
debug: Target = ProgramName_d

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

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

Это работает, пока перед ним стоит строка CONFIG +=.

1 голос
/ 20 февраля 2017

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

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