VC++ Redistributable 2012 or 2013 or 2015?



我有一个用QT编写的应用程序。之前我使用的是Visual Studio 2012和Qt 5.3.1,之后我最近升级到了Visual Studio 2015和Qt 5.6。我以前会提供msvcp110和msvcr110作为安装的一部分(我知道这不是最好的做法,但我侥幸逃脱了)。

升级后,由于VS 2015的变化,我现在不得不安装VC++2015。我不介意这些更改,目前正在提供要安装的redist包。

我面临的问题是,我必须提供VC++2012以及最近在Windows 8.1 Pro中运行该软件,我被要求提供VC++2013以及(从未使用VS2013进行编译)。诊断结果来自依赖walker和谷歌。不仅如此,我还必须安装所有3个版本的VC++的x86和x64才能启动该软件(老实说,我甚至不会开始)。

  1. 为什么我现在只使用Visual Studio 2015,却需要VC++2012和2013
  2. 如何摆脱其他redist包?是我写的依赖代码吗?如果是的话,我有机会知道吗
  3. 当我在64位编译器中严格编译时,为什么我需要同时提供32位和64位版本
  4. 有没有任何方法可以在没有依赖助行器的情况下进行诊断?当应用程序根本拒绝启动时,是否可以进行一些日志记录

很抱歉发了这么长的帖子,但这里的任何光线都可以恢复我的理智。

提前谢谢。

  1. 您正在使用链接到旧运行时的DLL。您可以在开发机器上使用Dependency Walker来跟踪这一点,不需要在客户机器上安装任何工具。

  2. 将应用程序附带的所有文件迁移到针对VC++2015构建的版本。

  3. 你没有提供任何可以揭示原因的细节。

  4. 对于语言运行库以外的DLL,可以使用延迟加载,然后能够捕获加载库的失败。但是你不能有效地延迟加载msvcr*.dll。一种选择是创建一个非常瘦的EXE,它根本不使用支持DLL(使用纯Win32 API,或静态链接运行时),除了安装错误处理程序,然后加载现在以DLL形式存在的主程序外,什么都不做。加载主程序DLL应该使用延迟加载链接或LoadLibrary()+GetProcAddress()来完成——任何一种都允许捕获错误。这个主程序DLL可以像往常一样自由地导入运行时DLL。

最新更新