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

卢波德

我正在按照本指南构建具有静态链接的Qt独立应用程序除最后一步外,我执行了每个步骤,最后一步是将清单嵌入到可执行文件中,并且应用程序可以在许多计算机上正常运行。但是,我发现其中一个无法启动可执行文件,因为计算机中缺少MSVCP140.dll。这很可能是由于我没有包含清单所引起的错误。实际上,在上面的指南中清楚地写着:

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

我的两个问题是:

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

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

请注意,这链接到Qt库分开的您可能是静态链接的,但忘记了静态链接CRT。

如果您使用的是Visual Studio,则会在此处找到合适的旋钮:
     项目→属性→配置→C / C ++→代码生成→运行时库。
对于要分发的发行版,请确保将其设置为/MT如今,多线程是唯一可用的选项。您不需要发行版本的“调试”版本,并且如果您是静态链接,也不需要DLL版本。确保此处所有项目以及链接到的其他任何静态库都设置为相同的选项。所有内容都需要使用相同版本的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给您,以作为后期制作步骤。只要您已安装Windows SDK,它就会在您的计算机上示例命令:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为采用文件和值参数的本地应用程序创建docker映像

如何为每个应用程序创建JVM实例?

使用Maven创建独立的应用程序

如何为您的Java应用程序创建本机二进制文件?

如何为Java应用程序创建Mac安装程序?

如何为Azure Web应用程序创建CSR文件

如何为应用程序添加清单权限?

如何为独立应用程序调用存储库方法?

如何为Qt应用程序提供脚本支持?

如何为TypeScript创建应用程序特定的配置文件?

如何为python应用程序创建rpm

如何为使用Mysql的Java应用程序创建exe文件

如何为Qt应用程序构建崩溃垫

如何为WinForms应用程序创建MSIX包?

如何为我的应用程序创建数据文件夹?

如何为已创建的数据库应用程序创建.jar文件?

如何为Linux创建自己的应用程序安装程序?

如何为整个Qt应用程序创建一个菜单?

Android-如何为我的应用程序文件创建“黑名单”

如何创建单个文件应用程序?

如何为应用程序创建评论部分

如何为文件浏览器应用程序创建文件夹列表:android

尝试创建独立的Sikuli应用程序

从Qt项目制作独立应用程序

如何为Xamarin.Android应用程序创建apk文件

如何为播放应用程序创建 systemd 单元文件

如何为 React CMS 应用程序创建添加文件夹功能?

如何为 .net 核心 MVC Web 应用程序创建和显示 PDF 文件?

如何为 React JS 应用程序创建 _redirects 文件以将其部署在 Netlify 上