Qt QMake:作用域是如何工作的?

Qt QMake:作用域是如何工作的?,qt,qmake,Qt,Qmake,出于某种奇怪的原因,我无法让QMake中的作用域工作。以下是我的项目文件中的一些代码: debug { QMAKE_CXXFLAGS_DEBUG += -g3 -O0 message ("Some debug output") } release { DEFINES += QT_NO_DEBUG DEFINES += QT_NO_DEBUG_OUTPUT message ("No debug output") } 但当我在调试模式下编译它时,我得到的g

出于某种奇怪的原因,我无法让QMake中的作用域工作。以下是我的项目文件中的一些代码:

debug {
    QMAKE_CXXFLAGS_DEBUG += -g3 -O0
    message ("Some debug output")
}

release {
    DEFINES += QT_NO_DEBUG
    DEFINES += QT_NO_DEBUG_OUTPUT
    message ("No debug output")
}
但当我在调试模式下编译它时,我得到的gcc命令行如下:

g++ -c -g -g3 -O0 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DLIBPROVERIM_LIBRARY -DQT_NO_DEBUG -DQT_NO_DEBUG_OUTPUT -DWINDOWS -DQT_DLL -DQT_SQL_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"c:\Qt\2010.05\qt\include\QtCore" -I"c:\Qt\2010.05\qt\include\QtNetwork" -I"c:\Qt\2010.05\qt\include\QtGui" -I"c:\Qt\2010.05\qt\include\QtXml" -I"c:\Qt\2010.05\qt\include\QtSql" -I"c:\Qt\2010.05\qt\include" -I"c:\Qt\2010.05\qt\include\ActiveQt" -I"debug" -I"..\proverim" -I"." -I"c:\Qt\2010.05\qt\mkspecs\win32-g++" -o debug\PForm.o ..\proverim\PForm.cc

请注意,我尝试清理我的项目,以及手动删除makefile。现在为什么要从两个作用域中进行定义?另外,我没有看到任何消息,它们应该在哪里?

我也有同样的问题。为了解决这个问题,我使用了配置“函数”而不是作用域。 .pro文件的该部分将是:

CONFIG(debug, debug|release) {
QMAKE_CXXFLAGS_DEBUG += -g3 -O0
message("DEBUG!")
} else {
DEFINES += QT_NO_DEBUG
DEFINES += QT_NO_DEBUG_OUTPUT
message("RELEASE!")
}

在一个简单的“HelloWorld”项目中尝试了它,一切似乎都很好。

还有一个名为的配置选项,它允许您同时构建两种模式。在这种情况下,两个作用域都被触发是正确的

尝试将
CONFIG=debug
添加到初始qmake命令中;它应该覆盖任何自动默认值,并将您限制为调试模式


作为调试措施,您还可以尝试通过.pro文件中的
消息($$CONFIG)
输出CONFIG的全部内容。这些消息是在运行qmake时打印的,而不是在编译makefile时打印的。

我没有提到:我的平台是MS Windows XP,带有Qt Creator 2.0.1和Qt 4.7.0。谢谢,现在我看到了这些消息。当我使用CONFIG=debug运行时,会执行适当的作用域,但是,我会得到很多缺少的头,比如QtCore/qglobal.h。我还尝试了CONFIG-=release,但没有任何效果:(尝试“CONFIG-=debug\u and\u release”这很有效,谢谢!不过,我觉得这个语法有点超凡脱俗。