web-dev-qa-db-ja.com

QMake .proファイルで異なるデバッグ/リリース出力ディレクトリを指定する方法

Qtプロジェクトがあり、ソースツリーの外部にコンパイルファイルを出力したい。

現在、次のディレクトリ構造があります。

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

構成(デバッグ/リリース)に応じて、結果のファイルをbuild/debugまたはbuild/releaseディレクトリの下のbuildディレクトリ内に出力します。

.proファイルを使用してこれを行うにはどうすればよいですか?

101
Etienne Savard

私の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

シンプルですが、ナイス! :)

146
mosg

ターゲットdll/exeのディレクトリを変更するには、プロファイルでこれを使用します。

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

オブジェクトファイルやmocファイルなど、他のビルドターゲットのディレクトリを変更することもできます(詳細については qmake変数参照 を、または qmake CONFIG()関数参照 を確認してください)。

49
chalup

私はよりコンパクトなアプローチを持っています:

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

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

これを行う正しい方法は次のとおりです(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

14
ABCplus

私は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"
}
13
Sulla

古い質問ですが、最新の回答に値するものです。現在、シャドウビルドが使用されているときに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 ...

次に、ビルドディレクトリにmakefileを生成し、makeはその下にファイルも生成します。 qmakeがソースディレクトリで実行されない限り、異なるバージョンが混在するリスクはありません(実行されている場合は、適切にクリーンアップしてください!)。

そして、このようにすると、現在受け入れられている回答の.proファイルはさらにシンプルになります。

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

また、出力実行可能ファイルに少し異なる名前を付けると便利です。次のようなものは使用できません。

release: Target = ProgramName
debug: Target = ProgramName_d

なぜ機能しないのかは明らかではありませんが、そうではありません。しかし:

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

これは、CONFIG +=行が前にある限り機能します。

3
Steve Besch

Qt Creatorの新しいバージョンには、デバッグとリリースの間に「プロファイル」ビルドオプションもあります。私はそれをどのように検出していますか:

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