首页 文章

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

提问于
浏览
96

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

我目前有以下目录结构:

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

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

我怎么能用.pro文件呢?

9 回答

  • 40

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

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

    您可能还希望更改其他构建目标(如目标文件和moc文件)的目录(有关详细信息,请选中qmake variable referenceqmake CONFIG() function reference) .

  • 3

    输出可执行文件的名称略有不同也很有用 . 你不能使用像:

    release: Target = ProgramName
    debug: Target = ProgramName_d
    

    为什么它不起作用尚不清楚,但事实并非如此 . 但:

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

    只要 CONFIG += 行在它之前,这确实有效 .

  • 46

    新版本的Qt Creator在调试和发布之间也有一个“profile”构建选项 . 这是我如何检测到:

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

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

    它很简单,但很好! :)

  • 13

    简短的回答是: 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.

  • 3

    老问题,但仍然值得一个最新的答案 . 今天,使用阴影构建时,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
    
  • 139

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

  • 1

    我有一个更紧凑的方法:

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

    我使用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"
    }
    

相关问题