Qtプロジェクトがあり、ソースツリーの外部にコンパイルファイルを出力したいと思います。
現在、次のディレクトリ構造があります。
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
構成(デバッグ/リリース)に応じて、ビルド/デバッグまたはビルド/リリースディレクトリの下のビルドディレクトリ内の結果ファイルを出力します。
どうすれば.proファイルを使用してそれを行うことができますか?
Qtプロジェクトがあり、ソースツリーの外部にコンパイルファイルを出力したいと思います。
現在、次のディレクトリ構造があります。
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
構成(デバッグ/リリース)に応じて、ビルド/デバッグまたはビルド/リリースディレクトリの下のビルドディレクトリ内の結果ファイルを出力します。
どうすれば.proファイルを使用してそれを行うことができますか?
回答:
短い答えは:あなたはしません。
ビルドしたいビルドディレクトリで実行する必要がqmake
ありmake
ます。そのため、debug
ディレクトリで1回、release
ます。
それはあなたのプロジェクトをビルドし、誰もが仕事にそれを期待する方法です、それはQtの自体がビルドに設定されている方法です、QtのCreatorは、あなたの期待する方法もありますその.pro
ファイルが動作するように:それは単に開始しqmake
、その後、make
ターゲットの選択した構成のビルドフォルダに。
これらのフォルダーを作成し、2つ(またはそれ以上)のビルドを実行する場合は、最上位のmakefileが必要です。qmakeを介して最上位のプロジェクトファイルから作成することもできます。
ビルド構成が3つ以上あることも珍しくありません。そのため、ビルドとリリースを区別することだけに専念していることになります。異なる最適化レベルのビルドなどがあるかもしれません。デバッグ/リリースの二分法は、安らかに休むことをお勧めします。
私の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
シンプルだけどいい!:)
DESTDIR
条件付きでsを定義し、他のすべてのパスでその値を使用しますOBJECTS_DIR = $${DESTDIR}/.obj
。乾杯!
Debug
、debug
とRelease
に変更する必要がありましたrelease
。
ターゲットdll / exeのディレクトリを変更するには、これをproファイルで使用します。
CONFIG(debug, debug|release) {
DESTDIR = build/debug
} else {
DESTDIR = build/release
}
また、オブジェクトファイルやmocファイルなど、他のビルドターゲットのディレクトリを変更することもできます(詳細については、qmake 変数のリファレンスまたはqmake CONFIG()関数リファレンスを確認してください)。
OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui
CONFIG()
使用してのいくつかの問題を解決することが判明release:
してdebug:
私はよりコンパクトなアプローチを持っています:
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
そして重要なことは、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
$(OUT_PWD)
かわかりませんが、おそらくQmake変数が解決策ですか?
mylib
。アプリケーションがピックアップする最もクリーンな方法は何ですか?これを行うための「優雅な」方法があるといいのですが、他の回答の手法を使用する以外の方法はありません。ビルドタイプと構成を使用LIBS
してスマートな方法で埋め、無効にするシャドウビルドの利点。
include(../mylib/mylib.pri)
また、出力実行可能ファイルの名前が少し異なると便利です。次のようなものは使用できません。
release: Target = ProgramName
debug: Target = ProgramName_d
なぜ機能しないのかは明らかではありませんが、機能しません。だが:
CONFIG(debug, debug|release) {
TARGET = ProgramName
} else {
TARGET = ProgramName_d
}
このCONFIG +=
行の前にある限り、これは機能します。
これは、さまざまなデバッグ/リリース出力ディレクトリ用の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$@