使用静态链接方式连接Microsoft CRT和OpenMP

3
我正在开发一些Windows软件,有时被用于嵌入式场景。我的用户经常会有一台专门的Win7或Win8电脑,他们从不更新,甚至不连接到互联网。用户将这些电脑插入到特定的工业硬件中,只用于一个任务。
我的软件包括我用Visual C ++编写的组件。我使用适当的安装程序合并模块将CRT包含在我的MSI包中。
不幸的是,对于从未更新过的PC,这并不起作用:今天我收到了一个错误报告,应用程序在启动时崩溃,显示“无法启动,因为api-ms-win-crt-stdio-l1-1-0.dll 在您的计算机上丢失”。
这个答案建议静态链接到CRT。
我做到了。但我C ++代码的某些部分依赖于OpenMP进行并行处理。 Dependency walker向我展示了我正在构建的DLL即使使用多线程(/MT)运行库设置也依赖于vcomp140.dll。
它还表明,vcomp140.dll仅依赖于kernel32.dll和user32.dll。
我可以只将那个单独的DLL vcomp140.dll放在安装文件夹中吗?它会在离线的Windows 7计算机上工作吗?

静态链接CRT是常见的建议,但不一定是最好的选择(例如,请参阅跨DLL边界传递CRT对象可能出现的错误)。更好的解决方案是将您的依赖项(CRT和其他)与您的应用程序一起部署。不要期望在任何给定的客户机器上找到特定版本的特定DLL。 - IInspectable
如果KB2999226是唯一的问题,我之前见过一些软件附带一个或多个Windows更新。不确定是否需要特殊许可才能这样做。另外,我对OpenMP不是很熟悉,但我认为它是开放的;您能否直接将其编译到您的应用程序中?结合静态运行时,可能会解决问题。 - Harry Johnston
微软不在运行时重新分发中包含一个并非总是安装的dll,这似乎非常不真诚。 - Chris Becke
@HarryJohnston 我不知道那个更新是否是唯一的问题。我只有一封电子邮件和一张来自使用离线Win7 PC的西班牙用户的屏幕照片,这是至少对于某些人而言该更新解决了问题的轶事证据,以及希望(+经济激励)让我的软件正常工作的愿望。 - Soonts
我已经解决了我的问题:静态链接到CRT,将vcomp140.dll安装到应用程序的文件夹中。现在我的应用程序甚至可以在从未更新过的Windows 7上运行 - 如果重新分发KB,则不可能,因为该KB仅适用于Win7 SP1。 - Soonts
显示剩余4条评论
2个回答

1
根据VS2015 Redistribution List,我认为复制该文件确实是您需要做的,并且会很好地工作(如果您使用VS2015构建应用程序)。请注意根据arm / x86 / x64复制正确的dll。

谢谢,我按照您的建议操作了一下,现在在我的VmWare Windows 7 sp0上运行正常。 - Soonts
但是首先我尝试了推荐的方法,使用微软提供的合并模块。从技术上讲,即使没有安装CRT,它也可以正常工作。问题是,合并模块会将vcomp140.dll安装到System32目录下。这意味着如果其他应用程序升级/降级/卸载了我的System32中的vcomp140.dll,我的应用程序可能会出现问题。所以最终我决定只包含这个DLL文件。 - Soonts
OpenMP 怎么样?有没有在 Visual Studio 中静态链接它的技巧? - Royi

1

为了明确起见,使用Visual Studio静态链接openmp是不可能的。你只能做两件事:

  • 移除openmp(并使用/MT /MTd编译)
  • 在你的应用程序中部署vcomp140.dll(或VC可分发文件)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接