【问题标题】:Statically link with Microsoft CRT, and OpenMP与 Microsoft CRT 和 OpenMP 静态链接
【发布时间】:2016-05-04 20:48:39
【问题描述】:

我正在开发一些有时用于嵌入式场景的 Windows 软件。对于我的用户来说,拥有一台专用的 Win7 或 Win8 PC 他们从不更新甚至不连接到 Internet 的情况并不少见。用户将这些 PC 插入特定的工业硬件,然后将该系统仅用于一项工作。

我的软件包括我用 Visual C++ 编写的组件。我使用适当的安装程序合并模块将 CRT 包含在我的 MSI 包中。

不幸的是,对于从未更新过的 PC,这不起作用:今天我收到一个错误报告,应用程序在启动时崩溃,说“无法启动,因为 api-ms-win-crt-stdio-l1-1 -0.dll 从您的计算机中丢失”

This answer 建议静态链接到 CRT。

做到了。但是我的 C++ 代码的某些部分依赖 OpenMP 来实现并行性。

Dependency walker 显示我正在构建的 DLL 依赖于 vcomp140.dll,即使在使用 Multi-threaded (/MT) 运行时库设置编译时也是如此。

还显示 vcomp140.dll 仅依赖于 kernel32.dll 和 user32.dll。

我可以将单个 DLL vcomp140.dll 放在安装文件夹中吗?它可以在离线 Windows 7 PC 上运行吗?

【问题讨论】:

  • 通常建议静态链接到 CRT,但不一定是最好的主意(例如,请参阅 Potential Errors Passing CRT Objects Across DLL Boundaries)。更好的解决方案是将您的依赖项(CRT 和其他)与您的应用程序一起部署。不要期望在任何给定的客户端机器上找到特定版本的特定 DLL。
  • 我只通过 DLL 边界传递 COM 接口,所以这不是问题。无法在从未更新的 Windows 7 上部署依赖项,因为现代 CRT 需要 KB2999226 Windows 更新。
  • 如果 KB2999226 是唯一的问题,我之前曾见过一些软件附带一个或多个 Windows 更新。不确定您是否需要特殊许可证才能这样做。或者,我对 OpenMP 不是很熟悉,但我认为它是开放的。你能把它直接编译到你的应用程序中吗?结合静态运行时,可能会解决问题。
  • 微软在运行时重新分发中不包含并不总是安装的 dll 似乎非常不诚实。
  • @HarryJohnston 我不知道该更新是否是唯一的问题。我所拥有的只是来自使用离线 Win7 PC 的西班牙用户的电子邮件 + 屏幕照片,轶事证据表明至少对于某些更新解决了问题的人来说,并且希望(+经济激励)使我的软件正常工作( tm)。

标签: c++ windows visual-c++ openmp msvcrt


【解决方案1】:

基于VS2015 Redistribution List,我会说复制该文件确实是您需要做的并且可以正常工作(如果您使用 VS2015 构建您的应用程序)。注意根据arm/x86/x64复制正确的dll。

【讨论】:

  • 谢谢,按照你所说的做了,现在在我的 VmWare Windows 7 sp0 上可以正常工作了。
  • 但首先我尝试了推荐的方式,使用 MS 提供的合并模块。即使没有安装 CRT,技术上也能正常工作。问题是,合并模块将 vcomp140.dll 安装到 System32。这意味着如果其他一些应用程序将在 System32 中升级/降级/卸载我的 vcomp140.dll,我的应用程序可能会中断。所以是的,最后只包含了 DLL。
  • OpenMP 怎么样?在 Visual Studio 中静态链接它的任何技巧?
【解决方案2】:

为了清楚起见,无法将 openmp 与 Visual Studio 静态链接。你只能做两件事:

  • 删除 openmp(并使用 /MT /MTd 编译)
  • 使用您的应用程序部署 vcomp140.dll(或 VC 可再发行组件)

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多