QMake CONFIG() 函数和“活动配置”

8
在阅读Qt 5.1文档(特别是qmake部分)时,我看到了qmake CONFIG()函数的说明,其中第二个参数的解释让我很困惑。我完全理解该函数的单参数版本,但对于双参数版本却一无所知。我认为我的困惑来自于“active config”这个定义的缺失,因为Qt 5.1文档中的解释如下:
“此函数可用于测试放置在CONFIG变量中的变量。这与作用域相同,但具有添加优势,即可以传递第二个参数以测试活动配置。由于CONFIG变量中值的顺序很重要(也就是说,互斥值的最后一个设置将被视为活动配置),因此可以使用第二个参数指定一组要考虑的值。”
我非常需要对“active config”概念进行解释,因为我完全不理解第二个参数,也无法从中获得任何实际意义。
1个回答

21

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

我想接受这个答案,但是我认为需要一个使用案例或其他原因来说明这种情况何时会发生。我不明白为什么CONFIG会同时设置为“debug”和“release”。针对这种情况,有单独的debug_and_release配置选项。您可以编辑您的答案并详细阐述一下为什么会出现这种情况吗? - C. Springer
1
我现在认为我理解了。所以,“活动配置”概念的运用大多取决于第三方工具或其他配置文件(.prf),这些可能会添加更多到CONFIG变量中?!而第二个参数会查找CONFIG中一组值的所有实例,确定第一个参数是否是“活动配置”(列表中的最后一个),如果是,则计算结果为true。希望我理解正确。感谢您的解释……我接受了您的答案。 - C. Springer
1
@cspringer非常感谢!CONFIG包含冲突选项可能还有其他原因。我向您展示了我所知道的唯一原因。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接