CONFIG 变量可以包含冲突的选项,例如“release”和“debug”。如果 CONFIG 同时包含“release”和“debug”,则“release”或“debug”其中之一有效。 CONFIG 中冲突选项的解释取决于顺序:最后一组将被视为有效或active config
.
使用带有一个参数的 CONFIG() 可以告诉您 CONFIG 变量中是否存在某个选项。如果“release”和“debug”都存在,则 CONFIG(release) 和 CONFIG(debug) 都返回 true。
使用带有两个参数的 CONFIG() 可以告诉您某个选项是否有效,它是active config
或不。 CONFIG(debug, debug|release) 测试“debug”是否是“debug”和“release”选项中的最后一个(因此是活动的)。
See this问题和答案也是如此。
EDIT:
我使用 Qt Creator 创建了一个新项目,打开生成的 .pro 文件并在底部添加以下行:message($${CONFIG})
这样我们在qmake运行时就可以看到CONFIG的内容了。我向您展示整个 .pro 文件:
QT += core
QT -= gui
TARGET = QMakeConfigTest
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
message($${CONFIG})
修改CONFIG的地方有两行,只增加了一个选项,删除了一个选项。然后我选择 Release Build 并运行 qmake。这是我在“编译输出”窗口中看到的内容:
08:53:49:项目 QMakeConfigTest 的运行步骤...
08:53:49:开始:“C:\ Qt \ Qt5.0.2 \ 5.0.2 \ msvc2010 \ bin \ qmake.exe”
C:\QMakeConfigTest\QMakeConfigTest.pro -r -spec win32-msvc2010
项目消息:lex yaccdebug异常depend_includepath
testcase_targets import_plugins import_qpa_plugin rtti_off
增量关闭 Windows qt warn_onreleaselink_prl 增量平坦
预编译头 autogen_precompile_source调试和发布debug_and_release_target embed_manifest_dll embed_manifest_exe
复制目录文件release共享 rtti qpa win32 msvcdebug调试构建
调试 build_pass 控制台
08:53:49:进程“C:\Qt\Qt5.0.2\5.0.2\msvc2010\bin\qmake.exe”
正常退出。
08:53:49:经过时间:00:00。
正如您所看到的,CONFIG 变量除了console
.pro 文件中添加的选项。它包含两次 debug 和 release 以及一次 debug_and_release 。
这些默认选项从哪里来?它们在 .prf 和 .conf 文件中定义,这些文件从名为的目录加载mkspecs
。因此,您在评论中提出的问题的答案是,在 qmake 处理 .pro 文件之前,会根据您的编译器和平台对其他几个文件进行预处理。这些文件可以多次添加相同的选项,并且可以向 CONFIG 变量添加冲突的选项。
这是内容C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\default_pre.prf
:
# This file is loaded by qmake right before each actual project file.
# Note that evaluating variable assignments from the command line
# still happens in between these two steps.
load(exclusive_builds)
CONFIG = \
lex yacc debug exceptions depend_includepath \
testcase_targets import_plugins import_qpa_plugin \
$$CONFIG
正如您所看到的,前 8 个默认选项是在此文件中定义的。
的内容C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\win32\default_pre.prf
:
CONFIG = rtti_off incremental_off windows $$CONFIG
load(default_pre)
的相关部分C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\spec_pre.prf
:
# This file is loaded by qmake right before loading the qmakespec.
# At this point, the built-in variables have been set up and the project's
# .qmake.super was read (if present).
CONFIG = qt warn_on release link_prl
QT = core gui
Qt Creator 使用以下选项运行 qmake.exe:-spec win32-msvc2010
。我们来看看qmake手册关于-spec 选项:
-spec 规范:qmake 将使用spec作为平台和编译器信息的路径,
并且 QMAKESPEC 的值将被忽略。
前几行来自C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\win32-msvc2010\qmake.conf
:
#
# qmake configuration for win32-msvc2010
#
# Written for Microsoft Visual C++ 2010
#
MAKEFILE_GENERATOR = MSBUILD
QMAKE_PLATFORM = win32
CONFIG += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe
DEFINES += UNICODE WIN32
QMAKE_COMPILER_DEFINES += _MSC_VER=1600 WIN32