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

时间:2016-06-13 14:28:27

标签: windows qt manifest

我正在使用this guide之后的静态链接构建一个Qt独立应用程序。我遵循了除最后一步之外的每一步,其中包括将清单嵌入到可执行文件中,并且应用程序在许多机器上运行正常;但是,我找到了一个无法启动可执行文件的地方,因为计算机中缺少MSVCP140.dll。这个错误很可能是因为我没有包含清单。实际上,在上面的指南中,它写得很清楚:

  

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

我的两个问题是:

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

1 个答案:

答案 0 :(得分:3)

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

请注意,单独与链接到Qt库。您可能静态链接这些,但忘记静态链接CRT。

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

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

至于清单,是的,所有Windows应用程序都应该包含清单。确切地说,清单中的内容取决于您的应用程序正在执行的操作以及您支持的Windows功能。但是,有99%的可能性要表示支持常见控件的版本6。您还希望将自己标记为UAC。您编写不需要管理权限的标准应用程序的可能性为85%,因此您的清单将指定asInvoker。清单中也可以包含其他内容,如DPI感知,Windows版本支持等。MSDN documentation包含更多详细信息,特别是Application Manifests部分。

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

<?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

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