我正在按照本指南构建具有静态链接的Qt独立应用程序。除最后一步外,我执行了每个步骤,最后一步是将清单嵌入到可执行文件中,并且应用程序可以在许多计算机上正常运行。但是,我发现其中一个无法启动可执行文件,因为计算机中缺少MSVCP140.dll。这很可能是由于我没有包含清单所引起的错误。实际上,在上面的指南中清楚地写着:
[...]您应该执行mt.exe来在应用程序中嵌入清单,以避免在其他计算机上启动该应用程序时出现诸如丢失MSVCP90.dll之类的错误
我的两个问题是:
如果您不想重新分发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] 删除。
我来说两句