如何在QMake .pro文件中指定不同的Debug / Release输出目录

时间:2010-04-05 20:19:18

标签: qt qmake

我有一个Qt项目,我想在源树之外输出编译文件。

我目前有以下目录结构:

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

根据配置(调试/发布),我想在build / debug或build / release目录下的build目录中输出结果文件。

如何使用.pro文件执行此操作?

11 个答案:

答案 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 referenceqmake 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

此处有更多信息: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

答案 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)

1。在CONFIG中找到调试/发布

获取当前版本(调试|发布)。

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

(可能是多个,因此请仅在构建中保留最后指定的内容):

2。设置DESTDIR

使用具有构建子目录名称的

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$@