[qt] QMake .pro 파일에서 다른 디버그 / 릴리스 출력 디렉토리를 지정하는 방법

Qt 프로젝트가 있고 소스 트리 외부에 컴파일 파일을 출력하고 싶습니다.

현재 다음과 같은 디렉토리 구조가 있습니다.

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

구성 (디버그 / 릴리스)에 따라 빌드 / 디버그 또는 빌드 / 릴리스 디렉토리 아래의 빌드 디렉토리에 결과 파일을 출력하고 싶습니다.

.pro 파일을 사용하여 어떻게 할 수 있습니까?



답변

짧은 대답은 : 당신은하지 않습니다 .

빌드하려는 빌드 디렉토리에서 qmake다음을 실행해야합니다 make. 따라서 debug디렉토리에서 한 번 , 디렉토리에서 한 번 실행하십시오 release.

이것이 바로 프로젝트를 빌드하는 모든 사람이 작업을 기대하는 방식이며, Qt 자체가 빌드를 위해 설정되는 방식이며, Qt Creator가 .pro파일이 작동 할 것으로 예상하는 방식이기도합니다. 파일이 시작된 qmake다음 make대상이 선택한 구성을위한 빌드 폴더에 있습니다.

이러한 폴더를 생성하고 그 안에 두 개 (또는 그 이상)의 빌드를 수행하려면, qmake를 통해 최상위 프로젝트 파일에서 생성 된 최상위 makefile이 필요합니다.

빌드 구성이 두 개 이상인 것은 드문 일이 아니므로 빌드와 릴리스를 구분하는 데 불필요하게 헌신하고 있습니다. 최적화 수준이 다른 빌드가있을 수 있습니다 . 디버그 / 릴리스 이분법은 편히 쉬는 것이 가장 좋습니다.


답변

내 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

간단하지만 멋지다! 🙂


답변

대상 dll / exe의 디렉토리를 변경하려면 pro 파일에서 다음을 사용하십시오.

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

또한 오브젝트 파일 및 moc 파일과 같은 다른 빌드 대상에 대한 디렉토리를 변경할 수도 있습니다 ( 자세한 내용은 qmake 변수 참조 또는 qmake CONFIG () 함수 참조 ).


답변

더 간결한 접근 방식이 있습니다.

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

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


답변

이를 수행하는 올바른 방법은 다음과 같습니다 (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


답변

나는 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"
}


답변

오래된 질문이지만 여전히 최신 답변의 가치가 있습니다. 오늘날에는 섀도우 빌드를 사용할 때 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

그리고 중요한 것은 a qmake가 빌드 디렉토리에서 실행 된다는 것입니다 .

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

그런 다음 빌드 디렉토리에 메이크 파일을 생성 한 다음 그 make아래에 파일도 생성합니다. qmake가 소스 디렉토리에서 실행되지 않는 한 서로 다른 버전이 뒤섞 일 위험이 없습니다 (그렇다면 잘 정리하는 것이 좋습니다!).

그리고 이렇게하면 .pro현재 승인 된 답변 의 파일이 더 간단 해집니다.

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