“此函数可用于测试放置在CONFIG变量中的变量。这与作用域相同,但具有添加优势,即可以传递第二个参数以测试活动配置。由于CONFIG变量中值的顺序很重要(也就是说,互斥值的最后一个设置将被视为活动配置),因此可以使用第二个参数指定一组要考虑的值。”
我非常需要对“active config”概念进行解释,因为我完全不理解第二个参数,也无法从中获得任何实际意义。
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"选项中最后一个(也就是有效的)选项。
参考这个问题和答案。
编辑:
我创建了一个新的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变量中包含了很多默认选项,除了在.pro文件中添加的console
选项外。其中包括两个debug和两个release以及一个debug_and_release。
这些默认选项来自哪里呢?它们是在加载名为mkspecs
的目录中的.prf和.conf文件中定义的。因此,在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 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