我有一个Qt项目,我想在源树之外输出编译文件。
我目前有以下目录结构:
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
根据配置(调试/发布),我想在build / debug或build / release目录下的build目录中输出结果文件。
如何使用.pro文件执行此操作?
答案 0 :(得分:142)
对于我的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
这很简单,但很好! :)
答案 1 :(得分:49)
要更改目标dll / exe的目录,请在您的专业文件中使用:
CONFIG(debug, debug|release) {
DESTDIR = build/debug
} else {
DESTDIR = build/release
}
您可能还想更改其他构建目标(如目标文件和moc文件)的目录(有关详细信息,请查看qmake variable reference或qmake CONFIG() function reference)。
答案 2 :(得分:40)
我有一个更紧凑的方法:
release: DESTDIR = build/release
debug: DESTDIR = build/debug
OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui
答案 3 :(得分: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"
}
答案 4 :(得分:12)
执行此操作的正确方法如下(感谢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
答案 5 :(得分:9)
老问题,但仍然值得一个最新的答案。今天,使用阴影构建时,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
答案 6 :(得分:3)
输出可执行文件的名称略有不同也很有用。你不能使用类似的东西:
release: Target = ProgramName
debug: Target = ProgramName_d
为什么它不起作用尚不清楚,但事实并非如此。但是:
CONFIG(debug, debug|release) {
TARGET = ProgramName
} else {
TARGET = ProgramName_d
}
只要CONFIG +=
行在它之前,这确实有效。
答案 7 :(得分:2)
简短的回答是:你不。
您应该在要构建的任何构建目录中运行qmake
,然后运行make
。因此,在debug
目录中运行一次,在release
中运行一次。目录
建立你的项目的任何人都希望它能够发挥作用,以及Qt本身是如何构建的,这也是Qt Creator如何期待你的.pro
文件行为:它只是在目标所选配置的构建文件夹中启动qmake
然后make
。
如果您希望创建这些文件夹并在其中执行两个(或更多)构建,则您需要一个顶级makefile,可能是通过qmake从顶级项目文件创建的。
拥有两个以上的构建配置并不罕见,因此您不必要地承诺仅区分构建和发布;您可能拥有不同优化级别的构建等。调试/发布二分法最好保持安静。
答案 8 :(得分:1)
新版本的Qt Creator在调试和发布之间也有一个“profile”构建选项。以下是我如何检测到:
-1
答案 9 :(得分:0)
获取当前版本(调试|发布)。
specified_configs=$$find(CONFIG, "\b(debug|release)\b")
build_subdir=$$last(specified_configs)
(可能是多个,因此请仅在构建中保留最后指定的内容):
使用具有构建子目录名称的
DESTDIR = $$PWD/build/$$build_subdir
答案 10 :(得分: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$@