我有一个Qt项目,我想在源树之外输出编译文件 .
我目前有以下目录结构:
/ |_/build |_/mylib |_/include |_/src |_/resources
根据配置(调试/发布),我想在build / debug或build / release目录下的build目录中输出结果文件 .
我怎么能用.pro文件呢?
要更改目标dll / exe的目录,请在pro文件中使用:
CONFIG(debug, debug|release) { DESTDIR = build/debug } else { DESTDIR = build/release }
您可能还希望更改其他构建目标(如目标文件和moc文件)的目录(有关详细信息,请选中qmake variable reference或qmake CONFIG() function reference) .
输出可执行文件的名称略有不同也很有用 . 你不能使用像:
release: Target = ProgramName debug: Target = ProgramName_d
为什么它不起作用尚不清楚,但事实并非如此 . 但:
CONFIG(debug, debug|release) { TARGET = ProgramName } else { TARGET = ProgramName_d }
只要 CONFIG += 行在它之前,这确实有效 .
CONFIG +=
新版本的Qt Creator在调试和发布之间也有一个“profile”构建选项 . 这是我如何检测到:
CONFIG(debug, debug|release) { DEFINES += DEBUG_MODE } else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE } else { DEFINES += RELEASE_MODE }
对于我的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
它很简单,但很好! :)
简短的回答是: you don't .
您应该在要构建的任何构建目录中运行 qmake ,然后运行 make . 因此,在 debug 目录中运行一次,在 release 目录中运行一次 .
qmake
make
debug
release
那个Qt本身是如何设置构建的,这也是Qt Creator期望你的 .pro 文件的行为:它只是在目标所选配置的构建文件夹中启动 qmake 然后 make .
.pro
如果您希望创建这些文件夹并在其中执行两个(或更多)构建,则需要一个顶级makefile,可能是通过qmake从顶级项目文件创建的 .
它不必要地承诺只区分构建版本和发布版本;你可能有不同优化级别的构建等 . The debug/release dichotomy is best left to rest in peace.
老问题,但仍然值得一个最新的答案 . 今天,使用阴影构建时,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
正确的方法如下(感谢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
我有一个更紧凑的方法:
release: DESTDIR = build/release debug: DESTDIR = build/debug OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui
我使用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" }
9 回答
要更改目标dll / exe的目录,请在pro文件中使用:
您可能还希望更改其他构建目标(如目标文件和moc文件)的目录(有关详细信息,请选中qmake variable reference或qmake CONFIG() function reference) .
输出可执行文件的名称略有不同也很有用 . 你不能使用像:
为什么它不起作用尚不清楚,但事实并非如此 . 但:
只要
CONFIG +=
行在它之前,这确实有效 .新版本的Qt Creator在调试和发布之间也有一个“profile”构建选项 . 这是我如何检测到:
对于我的Qt项目,我在* .pro文件中使用此方案:
它很简单,但很好! :)
简短的回答是: you don't .
您应该在要构建的任何构建目录中运行
qmake
,然后运行make
. 因此,在debug
目录中运行一次,在release
目录中运行一次 .那个Qt本身是如何设置构建的,这也是Qt Creator期望你的
.pro
文件的行为:它只是在目标所选配置的构建文件夹中启动qmake
然后make
.如果您希望创建这些文件夹并在其中执行两个(或更多)构建,则需要一个顶级makefile,可能是通过qmake从顶级项目文件创建的 .
它不必要地承诺只区分构建版本和发布版本;你可能有不同优化级别的构建等 . The debug/release dichotomy is best left to rest in peace.
老问题,但仍然值得一个最新的答案 . 今天,使用阴影构建时,Qt Creator会执行的操作很常见(默认情况下,在打开新项目时启用它们) .
对于每个不同的构建目标和类型,右侧
qmake
在不同的构建目录中使用右参数运行 . 那就是用简单的make
构建的 .因此,虚构的目录结构可能如下所示 .
重要的是,在构建目录中运行
qmake
:然后它在构建目录中生成makefile,然后
make
也会在它下面生成文件 . 只要qmake永远不会在源目录中运行,就不会有不同版本混淆的风险(如果是,那就更好地清理它了!) .当这样完成时,来自当前接受的答案的
.pro
文件甚至更简单:正确的方法如下(感谢QT支持团队):
更多信息: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建议的相同方法,