114

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

私は現在、次のディレクトリ構造を持っています。

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

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

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

4

11 に答える 11

157

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

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

于 2010-04-06T08:34:59.833 に答える
59

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

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

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

于 2010-04-05T20:46:30.030 に答える
44

私にはもっとコンパクトなアプローチがあります:

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

OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui
于 2012-10-13T11:17:22.563 に答える
19

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

于 2015-11-09T10:23:11.553 に答える
12

私は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"
}
于 2010-06-16T21:05:00.403 に答える
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

そして重要なことは、aqmakeがビルドディレクトリで実行されることです。

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
于 2014-04-05T19:04:09.520 に答える
3

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

release: Target = ProgramName
debug: Target = ProgramName_d

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

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

CONFIG +=これは、行が先行している限り機能します。

于 2013-10-29T19:20:32.363 に答える
3

簡単な答えは:あなたはしません

ビルドしたいビルドディレクトリで実行してから実行する必要がqmakeあります。したがって、ディレクトリで1回、ディレクトリで1回実行します。makedebugrelease

これは、プロジェクトをビルドするすべての人がプロジェクトの動作を期待する方法であり、Qt自体がビルドするように設定される方法でもあります。また、Qt Creator.proがファイルの動作を期待する方法でもあります。ファイルは単純に起動qmakemake、ターゲットの選択した構成のビルドフォルダーに配置されます。

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

3つ以上のビルド構成があることは珍しいことではないので、ビルドとリリースを区別することだけに不必要にコミットしていることになります。さまざまな最適化レベルなどのビルドがある可能性があります。デバッグ/リリースの二分法は、安心して休むのが最善です。

于 2016-04-07T20:34:05.027 に答える
1

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

CONFIG(debug, debug|release) {  DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else {                          DEFINES += RELEASE_MODE }
于 2017-02-20T18:22:32.760 に答える
0

これは、さまざまなデバッグ/リリース出力ディレクトリ用の私のMakefileです。このMakefileはUbuntuLinuxで正常にテストされました。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$@
于 2020-06-12T18:13:55.373 に答える
0

誰かが私のような問題に直面するかどうかはわかりませんが、私の設定を共有します。中央のproj.priファイルを使用して一般設定を保存します。各サブディレクトリにPKG.proがあり、これはすでにデバッグモード用に設計されています。したがって、デバッグとリリースの両方をビルドしようとすると、各サブディレクトリのすべてのPKG.proを変更したくありません。同じものを追加しました

DESTDIR = $${SOMEOTHERPATH}
release: DESTDIR = $${DESTDIR}/release
debug:   DESTDIR = $${DESTDIR}/debug

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

各サブディレクトリでDESTDIRが再度評価されるため、これは機能しません。ダブルデバッグまたはリリースを終了します。これを回避するには、1つのDESTDIRセットのみを使用する必要があります。その後、各サブディレクトリにこのproj.priファイルを含めることができます。このように、1つのDIRセットアップを作成する必要はありません。また、デバッグまたはリリースをビルドするには、「qmakeCONFIG=debug」または「qmakeCONFIG=release」が必要です。誰もがより良い解決策を持っています、共有してください。

于 2022-02-16T07:05:40.897 に答える