【问题标题】:QMake CONFIG() function and 'active configuration'QMake CONFIG() 函数和“活动配置”
【发布时间】:2013-08-10 17:22:58
【问题描述】:

在阅读 Qt 5.1 的文档,特别是 qmake 的文档时,我被文档中对 qmake CONFIG() 函数的解释难住了。我完全理解了函数的单参数版本,但是双参数版本对我来说完全没有意义。我认为我的困惑来自于缺乏对“活动配置”的定义,因为 Qt 5.1 文档说明了以下内容:

此函数可用于测试放入 CONFIG 变量中的变量。这与范围相同,但具有额外的优势,即可以传递第二个参数来测试活动配置。由于值的顺序在 CONFIG 变量中很重要(也就是说,最后一组将被视为互斥值的活动配置),因此可以使用第二个参数来指定要考虑的一组值。

我非常感谢对“活动配置”这个概念的解释,因为我完全被难住了,无法从第二个论点中获得任何实际意义。

【问题讨论】:

    标签: qt5 qmake


    【解决方案1】:

    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”选项中的最后一个(因此是活动的)。

    参见this问答。

    编辑:

    我用 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 yacc 调试异常depend_includepath testcase_targets import_plugins import_qpa_plugin rtti_off incremental_off windows qt warn_on release link_prl 增量平面 precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe copy_dir_files release shared rtti qpa win32 msvc debug DebugBuild 调试 build_pass 控制台

    08:53:49:进程“C:\Qt\Qt5.0.2\5.0.2\msvc2010\bin\qmake.exe” 正常退出。

    08:53:49:经过时间:00:00。

    正如您所见,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。来看看关于the -spec option的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
    

    【讨论】:

    • 我想接受这个答案,但我认为用例或其他原因会发生这种情况是合理的。我不明白为什么 CONFIG 会同时设置“调试”和“发布”。对于这种情况,有一个单独的 debug_and_release 配置选项。您能否编辑您的答案并详细说明为什么会发生这种情况?
    • 我想我现在明白了。因此,“活动配置”的概念发挥作用主要依赖于 3rd 方工具或其他配置文件 (.prf),它们可能会向 CONFIG 变量添加更多内容?!第二个参数在 CONFIG 中查找一组值的所有实例,确定第一个参数是否是“活动配置”(列表中的最后一个),如果是这种情况,则评估为 true。希望我做对了。感谢您的解释...我接受了您的回答。
    • @cspringer 非常感谢! CONFIG 包含冲突选项可能还有其他原因。我向你展示了我知道的唯一原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2011-07-07
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多