Qtプロジェクトがあり、ソースツリーの外にコンパイルファイルを出力したいと思います。
私は現在、次のディレクトリ構造を持っています。
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
構成(デバッグ/リリース)に応じて、ビルド/デバッグまたはビルド/リリースディレクトリの下のビルドディレクトリ内に結果のファイルを出力したいと思います。
.proファイルを使用してそれを行うにはどうすればよいですか?
私の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のディレクトリを変更するには、プロファイルでこれを使用します。
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
私は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
そして重要なことは、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
出力実行可能ファイルの名前を少し変えると便利です。次のようなものは使用できません。
release: Target = ProgramName
debug: Target = ProgramName_d
なぜそれが機能しないのかは明らかではありませんが、そうではありません。だが:
CONFIG(debug, debug|release) {
TARGET = ProgramName
} else {
TARGET = ProgramName_d
}
CONFIG +=
これは、行が先行している限り機能します。
簡単な答えは:あなたはしません。
ビルドしたいビルドディレクトリで実行してから実行する必要がqmake
あります。したがって、ディレクトリで1回、ディレクトリで1回実行します。make
debug
release
これは、プロジェクトをビルドするすべての人がプロジェクトの動作を期待する方法であり、Qt自体がビルドするように設定される方法でもあります。また、Qt Creator.pro
がファイルの動作を期待する方法でもあります。ファイルは単純に起動qmake
しmake
、ターゲットの選択した構成のビルドフォルダーに配置されます。
これらのフォルダーを作成し、それらのフォルダーで2つ(またはそれ以上)のビルドを実行する場合は、トップレベルのmakefileが必要です。これは、おそらくqmakeを介してトップレベルのプロジェクトファイルから作成されます。
3つ以上のビルド構成があることは珍しいことではないので、ビルドとリリースを区別することだけに不必要にコミットしていることになります。さまざまな最適化レベルなどのビルドがある可能性があります。デバッグ/リリースの二分法は、安心して休むのが最善です。
新しいバージョンのQtCreatorには、デバッグとリリースの間に「プロファイル」ビルドオプションもあります。これが私がそれを検出する方法です:
CONFIG(debug, debug|release) { DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else { DEFINES += RELEASE_MODE }
これは、さまざまなデバッグ/リリース出力ディレクトリ用の私の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$@
誰かが私のような問題に直面するかどうかはわかりませんが、私の設定を共有します。中央の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」が必要です。誰もがより良い解決策を持っています、共有してください。