C++ 如何在Qt中分离发布和调试构建?

C++ 如何在Qt中分离发布和调试构建?,c++,qt4,qmake,C++,Qt4,Qmake,我想把发行版和调试版的二进制文件放在源代码旁边的不同文件夹中。在.pro文件中: CONFIG(debug){ DESTDIR = ./debug OBJECTS_DIR = debug/.obj MOC_DIR = debug/.moc RCC_DIR = debug/.rcc UI_DIR = debug/.ui } CONFIG(release){ DESTDIR = ./release OBJECTS_DIR = release/

我想把发行版和调试版的二进制文件放在源代码旁边的不同文件夹中。在.pro文件中:

CONFIG(debug){
    DESTDIR = ./debug
    OBJECTS_DIR = debug/.obj
    MOC_DIR = debug/.moc
    RCC_DIR = debug/.rcc
    UI_DIR = debug/.ui
}

CONFIG(release){
    DESTDIR = ./release
    OBJECTS_DIR = release/.obj
    MOC_DIR = release/.moc
    RCC_DIR = release/.rcc
    UI_DIR = release/.ui
}
对于发布版本,一切都很好。我在项目的根目录中有一个./release目录。但是对于调试构建,qmake没有创建调试目录,它的名称是
release
(再次!):

更新:


替换调试和发布的顺序,生成调试目录。qmake只看到最后一个配置…

真正的解决方案是进行源代码外构建。这样,您就不必在每次从调试切换到发布构建再切换回来时都重新配置。要执行此操作,请使用以下命令:

mkdir build-dbg
cd build-dbg
qmake ../foo.pro CONFIG+=debug
cd ..
mkdir build-rel
cd build-rel
qmake ../foo.pro CONFIG+=release

另外,你不会因为构建碎片而污染源代码树。

如果你真的需要在源代码构建中进行操作,并且有单独的输出目录,我认为你需要根据更改你的条件


不过,别问我为什么。IMHO QMake是一个应该不惜一切代价避免的令人憎恶的东西…

这不是自动发生的吗?对我来说确实如此-我在不同的目录中得到不同的版本,与项目文件夹位于同一路径。@ddriver您可能在Windows上…是的,我想在Linux中是不同的。由于某些特定的原因,我在服务器上的每个项目只有一个文件夹,而服务器上的版本脚本只尝试级别1目录。。。当然,我不喜欢在源代码目录中混用二进制文件。添加神秘的
debug | release
修复了所有问题。我不问为什么!想详细谈谈你对qmake的看法吗?qmake比我以前使用过的许多其他构建管理工具要好得多…@stephelton该语言晦涩难懂,非常不一致,代码库混乱,基本上无法维护。就连这个。它不包括一个配置阶段,用户可以在该阶段调整内容,或者作者可以搜索标题、库和工具,它与Qt有很大的联系,对于非Qt项目来说几乎毫无用处。qmake现在被替换为。@MichaelWild感谢您提供的信息。你提到的“配置阶段”让我很沮丧。然而,正如我所提到的,它仍然比许多备选方案好得多,并且我已经在非Qt项目中有效地使用了它。你有什么建议吗?据我估计,它的优点在于它是跨平台的(理论上无论如何——我只在Linux中使用过它…),它支持大型复杂的代码库,不需要花太多精力,而且它在命令行和IDE中都工作得很好。使用任何现代软件包管理器都可以轻松安装。我使用的是,它功能强大,功能齐全。然而,它的语言也有它的缺陷,它不是每个人的口味。。。你可能想给,或者尝试一下。
mkdir build-dbg
cd build-dbg
qmake ../foo.pro CONFIG+=debug
cd ..
mkdir build-rel
cd build-rel
qmake ../foo.pro CONFIG+=release
CONFIG(debug, debug|release){
    DESTDIR = ./debug
    OBJECTS_DIR = debug/.obj
    MOC_DIR = debug/.moc
    RCC_DIR = debug/.rcc
    UI_DIR = debug/.ui
}

CONFIG(release, debug|release){
    DESTDIR = ./release
    OBJECTS_DIR = release/.obj
    MOC_DIR = release/.moc
    RCC_DIR = release/.rcc
    UI_DIR = release/.ui
}