QMake CONFIG()函数和'主动配置'

时间:2013-08-10 17:22:59

标签: qt5 qmake

在阅读Qt 5.1的文档,特别是qmake时,我对qmake CONFIG()函数文档中给出的解释感到困惑。我完全理解函数的单参数版本,但是双参数版本对我来说完全没有意义。我认为我的困惑来自缺乏“主动配置”的定义,因为Qt 5.1文档说明如下:

  

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

我非常感谢对“主动配置”概念的解释,因为我完全难以理解,并且无法从第二个论点中得出任何实际意义。

1 个答案:

答案 0 :(得分:14)

CONFIG变量可以包含冲突的选项,例如“release”和“debug”。如果CONFIG同时包含“release”和“debug”,则“release”或“debug”有效。 CONFIG中冲突选项的解释取决于顺序:最后一组将被视为有效或active config

将CONFIG()与一个参数一起使用会告诉您CONFIG变量中是否存在选项。如果同时存在“release”和“debug”,则CONFIG(release)和CONFIG(debug)都返回true。

使用带有两个参数的CONFIG()会告诉您选项是否有效,是active config还是message($${CONFIG})。 CONFIG(debug,debug | release)测试“debug”是否是“debug”和“release”选项中的最后一个(因此是活动的)。

请参阅this问题和答案。

编辑:

我用Qt Creator创建了一个新项目,打开生成的.pro文件并在底部添加了以下行:QT += core QT -= gui TARGET = QMakeConfigTest CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp message($${CONFIG}) 以便我们可以在qmake运行时看到CONFIG的内容。我告诉你整个.pro文件:

console

修改CONFIG有两行,只添加一个选项,删除一个选项。然后我选择了Release Build并运行qmake。这就是我在Compile Output窗口中看到的:

  

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 debug 异常depend_includepath   testcase_targets import_plugins import_qpa_plugin rtti_off   incremental_off windows qt warn_on release link_prl incremental flat   precompile_header autogen_precompile_source debug_and_release   debug_and_release_target embed_manifest_dll embed_manifest_exe   copy_dir_files 发布共享rtti qpa win32 msvc 调试 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文件中添加的mkspecs选项旁边的许多默认选项。它包含调试和发布两次以及debug_and_release一次。

这些默认选项来自哪里?它们在.prf和.conf文件中定义,这些文件是从名为C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\default_pre.prf的目录加载的。因此,您在评论中提出的问题的答案是,在qmake处理.pro文件之前,其他几个文件都是根据您的编译器和平台进行预处理的。这些文件可以多次添加相同的选项,并且可以为CONFIG变量添加冲突的选项。

以下是# 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 的内容:

C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\win32\default_pre.prf

如您所见,此文件中定义了前8个默认选项。

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 的相关部分:

-spec win32-msvc2010

Qt Creator使用以下选项运行qmake.exe:C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\win32-msvc2010\qmake.conf。我们来看看关于the -spec option的qmake手册:

  

-spec规范:qmake将使用 spec 作为平台和编译器信息的路径,   而且QMAKESPEC的价值将被忽略。

# # 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 的前几行:

{{1}}