如果您不想重新分发 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嵌入清单,因为此步骤(显然)会更改二进制文件,从而使签名无效。