使用msvc 2015编译的Windows桌面应用程序的便携式安装

时间:2017-03-23 08:07:04

标签: windows qt visual-c++ deployment

最近我从mingw切换到我的Qt应用程序的msvc编译器。 我使用的是Qt5.8。 msvc调试器来自windows 10工具包(虽然我在Win7和Win8.1上开发)和vc ++ 2015构建工具中的编译器。 我可以在本地运行应用程序,但我无法在另一台干净的计算机上运行它。 我知道我必须将编译器特定的dll复制到应用程序的可执行目录中。所有其他dll都是windeployqt找到的。我仍然无法让它发挥作用。我无法发送用户必须安装的vc_redist软件包,因为需要能够从pendrive加载应用程序。在开发机器上有几个同名的dll,我怎样才能弄清楚编译的应用程序实际使用了哪些? 可疑的dll特别是api-ms-win-crt-runtime-l1-1-0.dll

在部署上我遇到了这些错误:

enter image description here

enter image description here

我也尝试了Dependency Walker并展示了完整的路径。我假设第一层次级别是重要层次,这就是为什么我隐藏了更深层次的层次结构。我想知道为什么完整路径显示dir System32,因为这不是64位文件夹?我没有针对任何特定的,但我的应用程序必须在x86上运行。这是误会吗?

enter image description here

修改

根据another questionMicrosoft blog update,当我另外包含此文件夹C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86中的所有dll时,它对我有用。还有一个名为ucrtbase.dll的文件。我不知道为什么DependencyWalker表现出不同的。

1 个答案:

答案 0 :(得分:0)

您可以使用Dependency Walker等工具查看任何其他DLL或exe文件使用的DLL。 编辑 :您还可以查看MSDN上的Determining Which DLLs to Redistribute

此外,您可以使用静态链接链接MSVC运行时(即使用Map<string,ArrayList<ShopItem>> dic = new HashMap<string,ArrayList<ShopItem>>(); for(/*...*/) { string Manufacturer_Name = //you get the name if(/*the Manufacturer_Name is not in dic*/) { dic.put(Manufacturer_Name,new ArrayList<ShopItem>()); } dic.get(Manufacturer_Name).Add(/*what you want to add*/); } 开关而不是/MT(请参阅https://msdn.microsoft.com/en-US/library/2kzt1wy3.aspx)。但这也意味着重建Qt,但它也可以让你有机会构建一个静态版本的Qt,这意味着你不需要在你的exe旁边发送任何DLL。你可以在Qt wiki上找到更多信息:Build Standalone Qt Application for Windows