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

2023-11-24

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

此函数可用于测试放入 CONFIG 变量中的变量。这与作用域相同,但具有额外的优点,即可以传递第二个参数来测试活动配置。由于值的顺序在 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”选项中的最后一个(因此是活动的)。

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QMake CONFIG() 函数和“主动配置” 的相关文章

随机推荐

  • Java 中的内核绕过网络[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 有谁知道如何在 Java 中绕过内核吗 任何地方你好世界或者这是火箭科学 如果您使用 S
  • 使用 CSS 将字段集居中

    我试图将包含登录 用户名 和 密码 字段的字段集居中到页面的中心 这是我所拥有的 fieldset border 1px solid rgb 255 232 57 width 400px float left 我希望字段集在窗口中居中 无论
  • 修改 emacs 向前单词/向后行为(就像 vi/vim 中一样)

    实现与 vim 中的单词来回导航相同的行为的最简单方法是什么 在vim中 当你按 w 它将光标向前移动一个单词 其中单词由一系列字母 数字和下划线组成 或者由一系列其他非空白字符组成 并用空格 空格 制表符 eol 分隔 另一方面 在 em
  • 如何在 C# 中设置 .net teradata 连接?

    我正在尝试使用 c 连接到 Teradata 我正在使用来自的示例代码这个网站 using System using System Collections Generic using System Text using Teradata C
  • 任务“:app:dexDebug”Android Studio 执行失败

    该应用程序能够在更新我的 android studio 之前执行 这是我收到的错误 Error Execution failed for task app dexDebug gt com android ide common process
  • 将 Java FX 2.0 添加到现有 Netbeans 项目

    我在 Netbeans 中有一个使用 Swing 的现有 Java 项目 我想开始对该项目中的某些组件使用 Java FX 2 0 我已经下载了最新版本的 JDK 1 7 0 03 并启用了 JavaFX 但是当我尝试添加import ja
  • 如何访问超级视图控制器?

    我有一个问题 我会尝试解释这个问题 我有一个主要的UIViewController 全屏 我有一个二级UIViewController 设定范围 我将辅助视图添加到了我的mainView使用这个 mainController view ad
  • java中数据库中的Json对象

    谁能帮我如何从数据库创建 JSON 对象 这就是JSON 输出应该看起来像 devicelist device id 01 type CAM name Livingroom id 15 type CAM name Kitchen This
  • 防止提交时默认:- Angularjs

    如果填写表单时电子邮件为空 我想防止 http post 的默认操作为 sign Up 控制器代码 scope signUp function if scope email null preventdefault html 玉 form n
  • PowerShell 复制项目方法失败 - 文件名中包含括号

    我正在尝试使用 PowerShell v 1 仅复制与模式匹配的文件 文件命名约定是 Daily Reviews 0001 0871 journal Daily Reviews 1002 9887 journal 当我运行它时 方法 Cop
  • 尝试在 WinXP 上使用 pyserial 打开串行端口 ->“访问被拒绝”

    我正在尝试使用 python 和 pyserial 通过串口将数据发送到 hplc 泵 我在 linux gentoo 的衍生版本 下测试了电缆和泵 尽管是 root 但它工作得很好 现在我必须在WinXP机器上使用代码 在尝试打开端口时我
  • Dapper.net Oracle 参数

    我正在尝试将 Dapper net 与 Oracle 一起使用 由此post我知道我们可以使用没有前缀的参数 然后 dapper 就可以同时使用sql serverand oracle 如果没有显式的 oracle 命名参数前缀 我很难让它
  • Javascript在数组中找到最接近的数字而不进行下探

    例如 我有一个数字数组 300 500 700 1000 2000 3000 我想找到最接近的数字 而不低于给定的数字 例如 搜索 2200 将返回 3000 而不是 2000 但是 如果我搜索 3200 因为数组中没有更高的值 它应该返回
  • 将php对象存储在html表单元素上并通过GET方法传递php对象?

    我可能听起来有点奇怪 但是有办法吗 例如 我有一个 PHP 对象 foo 有没有办法通过某些对象加密函数以 HTML 表单 隐藏输入 存储该对象 然后使用解密函数检索该对象 同样 我可以通过 GET 方法传递这些对象吗 就像其他地方已经指出
  • React useEffect 导致:无法对未安装的组件执行 React 状态更新

    获取数据时 我得到 无法在未安装的组件上执行 React 状态更新 该应用程序仍然有效 但反应表明我可能会导致内存泄漏 这是一个空操作 但它表明应用程序中存在内存泄漏 要修复此问题 请取消 useEffect 清理函数中的所有订阅和异步任务
  • C# 读取注册表:ProductID 在 x86 目标应用程序中返回 null。 “任何CPU”都可以正常工作

    我最近搬到了一台装有 VS 2010 的 W7 64 位机器 我的项目设置为运行Any CPU 当我将其更改为目标时x86我注意到我的一些注册表调用不再起作用 我正在尝试阅读ProductID像这样的字段 RegistryKey windo
  • Bootstrap carousel:如何同时滑动两个carousel滑块?

    我在单个页面上有三个轮播滑块 我希望它们同时移动其中两个 即两者应该同时更改滑块图像 两者都有相同数量的图像 幻灯片 这是我正在使用的代码 jQuery carousel example generic1 carousel example
  • Interface Builder 中的颜色错误

    问题 我在 Interface Builder 中设置了颜色 设置了 RGB 通道 然后对工作窗口进行了屏幕截图 在 Photoshop 中打开它 并通过颜色选择器 我在 Interface Builder 中设置 检查颜色 结果 RGB值
  • 在 64 位 Windows 7 上使用 32 位版本的 ODBC?

    我在使用 ODBC 和使用 Visual Basic 6 因此它是 32 位 编写的应用程序时遇到问题 看来VB6的ODBC库与Windows 7的64位ODBC不兼容 返回的错误码是 2147220992并且它在谈论不兼容的架构 我可以安
  • QMake CONFIG() 函数和“主动配置”

    在阅读 Qt 5 1 的文档 特别是 qmake 的文档时 我对 qmake CONFIG 函数文档中给出的解释感到困惑 我完全理解该函数的单参数版本 但双参数版本对我来说完全没有意义 我认为我的困惑来自于缺乏 活动配置 的定义 因为 Qt