如何在 QMake .pro 文件中指定不同的调试/发布输出目录

问题描述 投票:0回答:11

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

我目前有以下目录结构:

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

根据配置(调试/发布),我希望将生成的文件输出到 build/debug 或 build/release 目录下的构建目录中。

如何使用 .pro 文件做到这一点?

qt qmake
11个回答
161
投票

对于我的 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

虽然简单,但是很好! :)


60
投票

要更改目标 dll/exe 的目录,请在您的 pro 文件中使用以下内容:

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

您可能还想更改其他构建目标的目录,例如目标文件和 moc 文件(查看 qmake 变量参考了解详细信息或qmake CONFIG() 函数参考)。


47
投票

我有一个更紧凑的方法:

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

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

21
投票

正确的方法如下(感谢 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


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"
}

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

重要的是,

qmake
在构建目录中运行:

cd build-mylib-XXXX
/path/to/right/qmake ../mylib/mylib.pro CONFIG+=buildtype ...

然后它会在build目录下生成makefile,然后

make
也会在其下生成文件。只要 qmake 从未在源目录中运行,就不存在不同版本混合的风险(如果是,最好清理干净!)。

这样完成后,当前接受的答案中的

.pro
文件就更简单了:

HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
           src/dialogs.cpp

3
投票

简短的回答是:你不

您应该在要构建的任何构建目录中运行

qmake
,然后运行
make
。因此,在
debug
目录中运行一次,在
release
目录中运行一次。

这就是构建您的项目的任何人期望它工作的方式,这就是 Qt 本身的构建方式,这也是 Qt Creator 期望您的

.pro
文件的行为方式:它只是开始
qmake
,然后是
make
您的目标所选配置的构建文件夹。

如果您希望创建这些文件夹并在其中执行两个(或更多)构建,您将需要一个顶级 makefile,可能是通过 qmake 从顶级项目文件创建的。

拥有两个以上的构建配置并不罕见,因此您不必要地致力于仅区分构建和发布;你可能有不同优化级别的构建,等等。调试/发布二分法最好保持安静。


3
投票

输出可执行文件的名称略有不同也很有用。你不能使用类似的东西:

release: Target = ProgramName
debug: Target = ProgramName_d

为什么它不起作用尚不清楚,但确实如此。但是:

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

只要

CONFIG +=
行在其前面,此方法就有效。


2
投票

新版本的Qt Creator还在调试和发布之间提供了“配置文件”构建选项。 这是我检测的方法:

CONFIG(debug, debug|release) {  DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else {                          DEFINES += RELEASE_MODE }

1
投票

这是我针对不同调试/发布输出目录的 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$@

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 将再次评估。它结束了双重调试或发布。为了避免这种情况,您必须仅使用一个 DESTDIR 集,然后在每个子目录中,您可以包含此 proj.pri 文件。这样,您就不需要编写一个 DIR 设置。 并且需要“qmake CONFIG=debug”或“qmake CONFIG=release”来构建调试或发布。 谁有更好的解决方案,请分享。

© www.soinside.com 2019 - 2024. All rights reserved.