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

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

我目前有以下目录结构:

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

根据configuration(debugging/发布),我想要在build / debug或build / release目录下的build目录下输出生成的文件。

我怎样才能做到这一点使用.pro文件?

对于我的Qt项目,我在* .pro文件中使用这个scheme:

 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 

这很简单,但很好! 🙂

要更改目标dll / exe的目录,请在pro文件中使用它:

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

您可能还想要更改其他构build目标(如对象文件和moc文件)的目录(有关详细信息,请查看qmakevariables参考或qmake CONFIG()函数参考 )。

我有一个更紧凑的方法:

 release: DESTDIR = build/release debug: DESTDIR = build/debug OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui 

我使用chalupbuild议的同样的方法,

 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在使用影子构build时所做的事情(打开一个新项目时默认启用它们)。

对于每个不同的构build目标和types,正确的qmake在不同的构build目录中使用正确的参数运行。 那么这只是简单的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运行在build目录中:

 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 

正确的做法如下(感谢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: Target = ProgramName debug: Target = ProgramName_d 

为什么它不起作用并不明确,但事实并非如此。 但:

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

只要CONFIG +=行在它之前就行。

简短的回答是: 你没有

你应该运行qmake然后在你想要构build的任何目录下运行。所以,在debug目录下运行一次,一次在release目录下。

这就是构build你的项目的任何人都希望它能够工作,这就是Qt本身是如何build立的,这也是Qt Creator期望你的.pro文件的行为:它只是启动qmake ,然后在目标的build文件夹中selectconfiguration。

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

拥有两个以上的构buildconfiguration并不罕见,所以你不必要的承诺只能区分构build和发布; 你可能会build立不同的优化级别等等。debugging/释放二分法是最好留下来安息。

新版本的Qt Creator在debugging和发布之间也有一个“profile”构build选项。 以下是我如何检测:

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