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


106

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

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

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

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

どうすれば.proファイルを使用してそれを行うことができますか?


Qtがデバッグビルドとリリースビルドを処理する方法は、時間の経過とともに内部的に変更されました。そのため、以前のバージョンのデバッグとリリースの切り替えが機能しなくなったことを発見しました。これまでのすべてのプラットフォームとすべてのQtバージョンで機能する私のソリューションをご覧ください。stackoverflow.com/questions/32046181/...
adlag

2
これは古い質問なので、投票数がはるかに少ないより良い回答があることを指摘する価値があります。
wardw 2018

回答:


5

短い答えは:あなたはしません

ビルドしたいビルドディレクトリで実行する必要がqmakeありmakeます。そのため、debugディレクトリで1回、releaseます。

それはあなたのプロジェクトをビルドし、誰もが仕事にそれを期待する方法です、それはQtの自体がビルドに設定されている方法です、QtのCreatorは、あなたの期待する方法もありますその.proファイルが動作するように:それは単に開始しqmake、その後、makeターゲットの選択した構成のビルドフォルダに。

これらのフォルダーを作成し、2つ(またはそれ以上)のビルドを実行する場合は、最上位のmakefileが必要です。qmakeを介して最上位のプロジェクトファイルから作成することもできます。

ビルド構成が3つ以上あることも珍しくありません。そのため、ビルドとリリースを区別することだけに専念していることになります。異なる最適化レベルのビルドなどがあるかもしれません。デバッグ/リリースの二分法は、安らかに休むことをお勧めします


151

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

シンプルだけどいい!:)


18
ちょうど私が必要なもの!そして注意:切り替えをさらに簡単にするために、DESTDIR条件付きでsを定義し、他のすべてのパスでその値を使用しますOBJECTS_DIR = $${DESTDIR}/.obj。乾杯!
ザビエルホルト

4
これがどのように使用されるか/それが何をするか説明することを心に留めてください?実装しても効果がないようです。編集:デバッグをデバッグ(小文字)に変更すると機能します。これはWindowsとUNIXの大文字と小文字を区別する問題だと思います。
notlesh

9
Windowsで動くので投票しました。Linux(Ubuntu 15.04、Qt 5.5.0)ではDebugdebugReleaseに変更する必要がありましたrelease
Jepessen

えっ?プラットフォームを横断するのはそれほどですか?@Jepessen ??
Nils

2
これは、CONFIGにリリースまたはデバッグのどちらかしかない場合にのみ機能します。両方が構成にある場合は、後者が使用されます。
weeska 2016年

52

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

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

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


5
しかし、これに$$ OUT_PWDを含める方がずっと良いことがわかったので、DESTDIR = $$ OUT_PWD / debug
Ivo

1
@イヴォ:ああ!ありがとうございました!私はどこにそのパスが含まれる変数を探してきました!:D
Cameron

1
この後、次のような行を追加することができますOBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui CONFIG()使用してのいくつかの問題を解決することが判明release:してdebug:
カーソンIpの

これは、選択した回答よりもうまく機能しました。選択したものは機能しますが、デバッグとリリースの両方が構成されている場合、設定の2番目のブロックが残ります。
Paulo Carvalho

42

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

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

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

2
あなたの答えは、コンパイラのビルド出力を別のディレクトリに配置する最新の方法です。
SIFE 2013

1
デバッグとリリースの両方でこれを最近試しましたか?私のビルド出力は、構成に関係なく、常にリリースフォルダーにあるようです。qmake / Qt Creatorの動作は、この回答を投稿した後で変わった可能性があります...
ssc

1
リリースモードでqmakeの追加引数に「CONFIG-= debug」を追加してみてください
Hello W

17

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


13

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

古い質問ですが、まだ最新の回答に値するものです。現在、シャドウビルドが使用されているときに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を生成し下にファイルも生成します。ソースディレクトリでqmakeが実行されない限り、異なるバージョンが混同されるリスクはありません(実行されている場合は、より適切にクリーンアップしてください!)。

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

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

単一のプロジェクトでは問題なく機能しますが、プロジェクトとライブラリがある場合はどうでしょうか。次に、ライブラリafaicsを含めるビルドタイプに依存する方法が必要です。
Adversus

@Adversus正確にはどういう意味$(OUT_PWD)かわかりませんが、おそらくQmake変数が解決策ですか?
ハイド

私の質問をあなたの例に当てはめると、次のようになりますmylib。アプリケーションがピックアップする最もクリーンな方法は何ですか?これを行うための「優雅な」方法があるといいのですが、他の回答の手法を使用する以外の方法はありません。ビルドタイプと構成を使用LIBSしてスマートな方法で埋め、無効にするシャドウビルドの利点。
Adversus、2015

@Adversus mylibが同じ最上位プロジェクトの下のサブディレクトリプロジェクトである場合、通常はmylib.priファイルを追加し、他のサブディレクトリプロジェクトに必要なものをすべて配置します。シャドウビルドであっても、Qmake変数を使用して常に正しいパスを取得します。その後、他のサブディレクトリの.proファイルは単に次のようになりますinclude(../mylib/mylib.pri)
hyde

おかげで、それは今私がやっていることのようなもので、cmakeにサブプロジェクトを含むプロジェクトがあり、簡単に別のプロジェクトを作成できるような場合に、これが自動的に処理されるソリューションがあれば素晴らしいと思いますツリー全体のソースビルド。
Adversus、2015

3

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

release: Target = ProgramName
debug: Target = ProgramName_d

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

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

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


1

Qt Creatorの新しいバージョンには、デバッグとリリースの間に「プロファイル」ビルドオプションがあります。これが私がそれを検出する方法です:

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

0

1. CONFIGでデバッグ/リリースを見つける

現在を取得します(デバッグ|リリース)。

specified_configs=$$find(CONFIG, "\b(debug|release)\b")
build_subdir=$$last(specified_configs)

(複数になる可能性があるため、ビルドで最後に指定されたもののみを保持):

2. DESTDIRを設定します

ビルドサブディレクトリ名を使用します

DESTDIR = $$PWD/build/$$build_subdir

0

これは、さまざまなデバッグ/リリース出力ディレクトリ用のMakefileです。このMakefileはUbuntu linuxで正常にテストされました。Mingw-w64が正しくインストールされていれば、Windowsでシームレスに動作するはずです。

ifeq ($(OS),Windows_NT)
    ObjExt=obj
    mkdir_CMD=mkdir
    rm_CMD=rmdir /S /Q
else
    ObjExt=o
    mkdir_CMD=mkdir -p
    rm_CMD=rm -rf
endif

CC     =gcc
CFLAGS =-Wall -ansi
LD     =gcc

OutRootDir=.
DebugDir  =Debug
ReleaseDir=Release


INSTDIR =./bin
INCLUDE =.

SrcFiles=$(wildcard *.c)
EXEC_main=myapp

OBJ_C_Debug   =$(patsubst %.c,  $(OutRootDir)/$(DebugDir)/%.$(ObjExt),$(SrcFiles))
OBJ_C_Release =$(patsubst %.c,  $(OutRootDir)/$(ReleaseDir)/%.$(ObjExt),$(SrcFiles))

.PHONY: Release Debug cleanDebug cleanRelease clean

# Target specific variables
release: CFLAGS += -O -DNDEBUG
debug:   CFLAGS += -g

################################################
#Callable Targets
release: $(OutRootDir)/$(ReleaseDir)/$(EXEC_main)
debug:   $(OutRootDir)/$(DebugDir)/$(EXEC_main)

cleanDebug:
    -$(rm_CMD) "$(OutRootDir)/$(DebugDir)"
    @echo cleanDebug done

cleanRelease:
    -$(rm_CMD) "$(OutRootDir)/$(ReleaseDir)"
    @echo cleanRelease done

clean: cleanDebug cleanRelease
################################################

# Pattern Rules
# Multiple targets cannot be used with pattern rules [https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html]
$(OutRootDir)/$(ReleaseDir)/%.$(ObjExt): %.c | $(OutRootDir)/$(ReleaseDir)
    $(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o"$@"

$(OutRootDir)/$(DebugDir)/%.$(ObjExt):   %.c | $(OutRootDir)/$(DebugDir)
    $(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o"$@"

# Create output directory
$(OutRootDir)/$(ReleaseDir) $(OutRootDir)/$(DebugDir) $(INSTDIR):
    -$(mkdir_CMD) $@

# Create the executable
# Multiple targets [https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html]
$(OutRootDir)/$(ReleaseDir)/$(EXEC_main): $(OBJ_C_Release)
$(OutRootDir)/$(DebugDir)/$(EXEC_main):   $(OBJ_C_Debug)
$(OutRootDir)/$(ReleaseDir)/$(EXEC_main) $(OutRootDir)/$(DebugDir)/$(EXEC_main):
    $(LD) $^ -o$@
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.