【发布时间】: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