Microsoft CRT 和 OpenMP 静态 link

Statically link with Microsoft CRT, and OpenMP

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

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

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

This answer 建议静态 link 到 CRT。

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

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

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

我可以只将单个 DLL vcomp140.dll 放在安装文件夹中吗?它可以离线使用 Windows 7 台电脑吗?

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

复制正确的 dll

为了清楚起见,用 Visual Studio 静态 link openmp 是不可能的。您只能做两件事:

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