如何为 Qt 独立应用程序创建清单文件

2023-12-06

我正在构建一个带有静态链接的 Qt 独立应用程序本指南。我遵循了除最后一步之外的每一步,最后一步包括将清单嵌入到可执行文件中,并且应用程序在许多机器上运行良好;然而,我发现可执行文件无法启动,因为计算机中缺少 MSVCP140.dll。这个错误很可能是由于我没有包含清单而引起的。事实上,上面的指南中写得很清楚:

[...]您应该执行 mt.exe 在应用程序中嵌入清单,以避免在其他计算机上启动应用程序时出现丢失 MSVCP90.dll 等错误

我的两个问题是:

  1. 在这种情况下,manifest 文件的作用是什么?为什么在某些机器上应用程序可以在没有它的情况下运行,而在其他机器上则需要它?据我所知,用于测试的计算机上均未安装 Visual Studio。
  2. 如何为我的 Qt 应用程序生成此类文件?我按照指南的步骤操作,但没有自动生成 .manifest 文件。因此,我假设我在构建 Qt 的静态版本时错过了一些东西,或者我应该使用一些外部工具来完成它。例如,我看到了Mage.exe可用于生成清单,但我不知道这是否适合我的情况。

如果您不想重新分发 DLL,则需要将 CRT 静态链接到应用程序中。如果您这样做了,您就不会收到有关 DLL 丢失的错误。您的应用程序不会使用 DLL,因为它是静态链接的。

请注意,这是separate从链接到 Qt 库。您可能静态链接这些,但忘记静态链接 CRT。

如果您使用的是 Visual Studio,您将在此处找到合适的旋钮:
项目→属性→配置→C/C++→代码生成→运行时库。
对于您将要分发的发布版本,请确保将其设置为/MT。多线程是当今唯一可用的选择。您不需要发布版本的“调试”版本,如果静态链接,您也不需要 DLL 版本。确保all您的项目在此处设置为相同的选项,您链接的任何其他静态库。一切都需要使用相同版本的 CRT 以避免兼容性问题。

如果您使用不同的 IDE/编译器工具集,则需要查阅其文档以了解如何配置这些设置。你在问题中没有提到具体的一个。

至于清单,是的,所有 Windows 应用程序都应该包含清单。清单中的具体内容取决于您的应用程序正在执行的操作以及您支持的 Windows 功能。但有 99% 的可能性您希望表明对公共控件版本 6 的支持。您还需要将自己标记为具有 UAC 意识。您编写的标准应用程序有 85% 的可能性不需要管理权限,因此您的清单将指定asInvoker。其他内容也可以包含在清单中,例如 DPI 感知、Windows 版本支持等。MSDN 文档包含更多详细信息,特别是有关的部分应用清单.

标准应用程序的示例清单可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">

  <!-- Enable use of version 6 of the common controls (Win XP and later) -->
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32"
                        name="Microsoft.Windows.Common-Controls"
                        version="6.0.0.0"
                        processorArchitecture="*"
                        publicKeyToken="6595b64144ccf1df"
                        language="*" />
    </dependentAssembly>
  </dependency>

  <!-- Indicate UAC compliance, with no need for elevated privileges (Win Vista and later) -->
  <!-- (if you need enhanced privileges, set the level to "highestAvailable" or "requireAdministrator") -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

  <!-- Indicate high API awareness (Win Vista and later) -->
  <!-- (if you support per-monitor high DPI, set this to "True/PM") -->
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
  </application>

  <!-- Declare support for various versions of Windows -->
  <ms_compatibility:compatibility xmlns:ms_compatibility="urn:schemas-microsoft-com:compatibility.v1" xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <ms_compatibility:application>
      <!-- Windows Vista/Server 2008 -->
      <ms_compatibility:supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
      <!-- Windows 7/Server 2008 R2 -->
      <ms_compatibility:supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
      <!-- Windows 8/Server 2012 -->
      <ms_compatibility:supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
      <!-- Windows 8.1/Server 2012 R2 -->
      <ms_compatibility:supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
      <!-- Windows 10 -->
      <ms_compatibility:supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
    </ms_compatibility:application>
  </ms_compatibility:compatibility>

</assembly>

清单是一个简单的文本文件,遵循 Microsoft 定义的 XML 架构,您可以使用 SDK 工具将其链接到应用程序的二进制文件。具体来说,mt.exe为您执行此操作,将清单合并到二进制文件中。通常这是在链接时完成的。 Microsoft 的链接器会自动为您完成此操作。我不确定其他供应商的链接器。你当然可以打电话mt.exe作为构建后步骤为您完成此操作。只要您安装了该软件,它就会在您的计算机上视窗软件开发工具包。命令示例:

mt.exe -manifest MyApp.exe.manifest -outputresource:MyApp.exe;#1

如果您要签署二进制文件,请确保您签署after嵌入清单,因为此步骤(显然)会更改二进制文件,从而使签名无效。

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

如何为 Qt 独立应用程序创建清单文件 的相关文章

  • 仅将 Firesharp 用于 Windows 桌面推送通知

    我想在 Windows 桌面应用程序中使用 Firesharp 该应用程序只会接收来自 Firebase 的通知 并且不会有任何类型的数据库交互 Firebase Cloud Messaging FCM 是 Firebase 唯一使用的东西
  • 将 Metro 应用程序固定到任务栏 Windows 10 Powershell

    以下代码将固定 Metro 应用程序以在给定 AUMID 的情况下启动 如果你改变 match Pin To Start 不幸的是 将匹配更改为 固定到任务栏 不起作用 这里发生了什么 function Pin Taskbar param
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 在 powershell 脚本中以不同用户身份本地运行代码块

    这是非常简单的事情 但我就是无法让任何东西发挥作用 我想在特定用户下的 powershell 脚本中运行块代码 关键字是locally我正在使用 powershell 2 0 Invoke Command 似乎需要远程主机 我运行以下命令
  • Unix 命令“host” - Windows 中有等效命令吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在一台 Windows 7 机器上 按照本文指示我使用 Unix 命令 host https devcenter heroku com
  • 你知道 Windows 上有类似的 wc(unix 字数统计命令)程序吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 快速搜索给了我陶巴瓦厕所 http www tawbaware com wc htm 但它不接受 std
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 64 位大型 malloc

    malloc 失败的原因是什么 尤其是在 64 位中 我的具体问题是尝试在 64 位系统上分配一大块 10GB RAM 该机器有 12GB RAM 和 32GB 交换空间 是的 malloc 是极端的 但是为什么它会成为一个问题呢 这是在带
  • 在 WSL Ubuntu 20.04 上安装 npm 后,我收到消息“/usr/bin/env: ‘bash\r’: No such file or directory”

    运行时我看到以下消息npm install or npm来自终端的命令 执行中node按预期工作 gt npm install usr bin env bash r No such file or directory 2023 年 7 月更
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 在 wampserver 2.2 上安装 php_imagick.dll PHP 扩展

    我使用的是 32 位操作系统的 Windows 7 我安装了 ImageMagick 6 8 7 Q16Link https www imagemagick org script download php windows我能够从命令行 转换
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • Pip 无法在 Windows 上安装 Twisted

    我正在尝试在 Windows 8 计算机上安装 Twisted 在 Twisted 官方网站上 只有一个 Windows 版的 Wheel 文件 https twistedmatrix com trac wiki Downloads htt
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • Windows 睡眠功能极慢

    我正在通过 Windows h 使用 Sleep 命令制作一个程序 并且在 Windows 10 而不是 Windows 7 上运行我的程序时遇到了令人沮丧的差异 我将我的程序简化为下面的程序 它与我的更复杂的程序表现出相同的行为 在 Wi
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • 哪个版本的 Miniconda 具有适用于 Windows 64 位的 Python 3.6?

    我正在开发一个需要这些深度学习库的项目 keras 和 tensorflow 不幸的是 这些不适用于 Python 3 7 有人可以告诉我一个带有 Python 3 6 的 Miniconda 版本 适用于 Windows 64 位 吗 我

随机推荐

  • 在 MySQL 中处理事件

    我有一个存储过程 它基本上从一个表中选择数据并插入到另一个表中 基本上我是手动进行数据归档 现在 我想写一个事件 就像讨论的那样here 然而 在阅读该文章并在线研究后 我开始知道不可能在存储过程中创建事件 有没有办法在 MySQLWork
  • Tensorflow.js inputShape 与模型输入不匹配

    这似乎很基本 但我无法弄清楚 所以我有样本 数据 输入 它是一个由 10 个整数组成的数组 而输出 标签只是一个整数数组 让我解释一下 因为我的数据可能结构不正确 基于 10 个整数的输入 我告诉模型结果是标签 输出中的 1 个整数 最重要
  • 原始类型指针之间的转换

    以下是明确定义的 char charPtr new char 42 int intPtr int charPtr charPtr intPtr int charPtr The intPtr未正确对齐 至少在两种情况之一 仅仅把它放在那里就违
  • 通过实例调用静态方法的替代方法

    JOptionPane jop new JOptionPane jop showMessageDialog This is never done 有人告诉我这样做的品味很差 我的意思是它有效 但显然 专业人士 不会这样做 因为 showMe
  • SQLiteFunction简单不工作

    我尝试从我的 C 和 ADO NET 代码中使用 SQLiteFunction 谁能告诉我为什么我会遇到这个问题 System Data SQLite dll 中发生类型为 System Data SQLite SQLiteExceptio
  • 如何使用 SMO 连接到 Sqlserver2008 必须采取任何解决方法吗?

    我写这个是为了在本地计算机上查找 sql server 实例 using System using System Data using Microsoft SqlServer Management Smo namespace Applica
  • 插入“赋值运算符表达式”以完成表达式

    我正在使用 Java 但出现错误 插入 赋值运算符表达式 以完成表达式 这个错误是什么意思 是否有所有 java 错误消息及其含义的列表 thanks 根据这一页你正在做这个 编写不带赋值运算符的赋值语句 max Error missing
  • 我应该在我自己的代码之后还是之前调用[super superMethod]?

    抱歉我的英语不好 问题很简单 但我很难表达它并在谷歌中找到它 我应该 在所有类似的情况下 当我重写 super 方法时 不仅仅是这个方法 使用 void viewDidLoad my code super viewDidLoad or vo
  • Apache Flink Streaming 窗口 WordCount

    我有以下代码来计算 socketTextStream 中的单词数 需要累积字数和时间窗口字数 该程序存在一个问题 即 cumulateCounts 始终与窗口计数相同 为什么会出现这个问题 基于窗口计数计算累积计数的正确方法是什么 Stre
  • scrapy中使用爬虫初始化管道对象

    基于Scrapy 与二级网站交互时的程序组织 我有 class MyPipeline object def init self crawler self crawler crawler 我试图更好地理解代码 尤其是上面列出的开头的行 为什么
  • 类中的 Powershell winform 事件处理程序导致范围问题

    我正在尝试创建 GUI 并在 powershell 中使用类 我对这两件事都很陌生 通常在较小程度上对 powershell 也很陌生 所以请耐心等待 我遇到的问题是我无法进行任何对表单进行修改的控件 这是因为当向按钮添加处理程序时 它会进
  • 如何在 PHP 中将 unicode 符号转换为 ascii 安全等价物

    用户可能输入类似 的字符 如何在 php 中删除该标记并变成 A E u Thanks 您可以使用 iconv UTF 8 ASCII TRANSLIT 您可以创建一个函数来保存要交换的字符数组并传递字符串 然后将 更改为这种方式 如果 i
  • SQL Server过程执行计划的奇怪问题

    我想知道你们是否可以帮助我解决我最近在 SQL Server 上遇到的一个奇怪问题 我有一个存储过程 让我们调用SPold 它相当大 需要进行大量计算 不可能在应用程序中执行此操作 因为大约 6000 个用户的信息需要一次性返回 我根据姓氏
  • Excel 帮助:动态范围 + 数据验证

    我遇到了一些流行的 Excel 问题 动态范围 数据验证下拉菜单和自动填充问题 假设我有两张纸 在一张纸上我有下拉菜单可以从另一张纸中进行选择 当我使用以下方法定义单元格和范围时 这不是问题 OFFSET A 19 COUNTA 0528
  • Websocket - 客户端未收到数据

    我正在编写一些基于 websockets RFC 6455 的应用程序 不幸的是 客户端 在 Chrome 18 上测试 似乎没有收到数据 但服务器说它正在发送 Chrome 没有说什么 以下是主要的服务器方法 private functi
  • Java中将数字的所有数字相加并分别显示数字

    我经常使用这个网站 但我从未真正写过任何东西 今天 我偶然发现了一个我似乎找不到解决方案的问题 问题是 我有一个int variable具有未知数量的数字 要求我将所有这些数字相加 然后将其打印 显示为消息 并将所有这些数字分开 例如 用户
  • 在MySQL中,我可以复制一行插入同一张表中吗?

    insert into table select from table where primarykey 1 我只想复制一行以插入到同一个表中 即 我想复制表中的现有行 但我想这样做而不必列出 select 之后的所有列 因为该表有太多的列
  • LocalDate.parse 是否默默地更正日期数字?

    String s 2020 Jun 31 DateTimeFormatter formatter DateTimeFormatter ofPattern yyyy MMM dd LocalDate date LocalDate parse
  • 尝试关闭 OpenCV 窗口没有效果

    我正在使用 OpenCV 捕获网络摄像头图像 效果很好 但是如果我想在按下按钮时关闭 OpenCV 它不起作用 尝试了cvDestroyWindow NameOfWindow and cvDestroyAllWindows 窗口保持打开状态
  • 如何为 Qt 独立应用程序创建清单文件

    我正在构建一个带有静态链接的 Qt 独立应用程序本指南 我遵循了除最后一步之外的每一步 最后一步包括将清单嵌入到可执行文件中 并且应用程序在许多机器上运行良好 然而 我发现可执行文件无法启动 因为计算机中缺少 MSVCP140 dll 这个