c++ - Visual Studio 2015 运行时依赖或如何摆脱 Universal CRT?

标签 c++ visual-studio-2015 msvcrt

使用 Visual Studio 2015 编译了几个 .dll,并尝试部署在一些较旧的 Windows 7/64 位上。还尝试猜测应用程序需要哪些 dll 才能启动并复制 MSVCP140.DLL 和 VCRUNTIME140.DLL - 但应用程序无法加载 vs2015 dll。开始分析出了什么问题 - 依赖遍历器显示了来自以下 dll 的依赖关系:

API-MS-WIN-CRT-MATH-L1-1-0.DLL
API-MS-WIN-CRT-HEAP-L1-1-0.DLL
API-MS-WIN-CRT-CONVERT-L1-1-0.DLL
API-MS-WIN-CRT-STRING-L1-1-0.DLL
API-MS-WIN-CRT-STDIO-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-FILESYSTEM-L1-1-0.DLL
API-MS-WIN-CRT-TIME-L1-1-0.DLL

这尤其令人惊讶,因为据我所知,CRT 负责启动 dll/exe,它不提供任何更高级别的服务。

好的,试图弄清楚如何摆脱它们或至少减少它们。

找到一篇文章: https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/

它提到了发布静态库 - 所以我认为我可以链接它们并摆脱 *L1-1-0.DLL* 依赖 hell ,但无论我尝试了什么 - 我都没有成功。我尝试链接 libvcruntime.lib、libucrt.lib、libcmt.lib,尝试使用链接器选项“/nodefaultlib:vcruntime.lib”禁用,甚至尝试添加包含目录 $(UniversalCRT_IncludePath),还覆盖了一些的定义,因为我试图猜测它们有效 - 我的尝试都没有帮助。

作为一种中间解决方案,我回退到使用 Visual Studio 2013,其中 CRT dll 只有两个:msvcp120.dll、msvcr120.dll。

当然,您可能会建议安装 Visual Studio 2015 运行时,但我们的要求之一是支持独立的可执行文件 - 无需任何安装即可工作 - 所以现在额外安装是不可能的。

除了等待 Visual Studio 2017 到来之外,你还能推荐我什么吗?

最佳答案

,你无法摆脱它们,但我可以通过设置 C/C++ > 代码生成 > 运行时库 编译器选项

  • 对于调试:从 /MDd/MTd
  • 对于发布:从 /MD/MT

这删除了所有 API-MS-WIN-CRT-* 和运行时 dll 引用,并导致所有 CRT 代码被静态链接。

关于新的 VS2015 Universal CRT(动态和静态)的详细信息在这里: https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx

Note that the only other option is to compile with an older-compiler (like virus developers), not newer, because Microsoft promises same UCRT-requirements for any newer compiler-version as well.

关于c++ - Visual Studio 2015 运行时依赖或如何摆脱 Universal CRT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35805113/

相关文章:

c++ - 使用智能指针读取访问冲突

c++ - VS2010不理解自己文件的字符串编码

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

c# - 在 Visual Studio 2015 中观看图标和项目

c++ - Visual Studio 2015/Linux 扩展使用 Cygwin 生成 "collect2 : error : ld returned 1 exit status"

c++ - 如何确定哪个 Windows DLL 正在用于函数调用?

c++ - 在 C++ 中连接字符串时出错

c# - Visual Studio 2015、Nuget 和 “same key has already been added.”

c - Microsoft C 运行时中的 msvcp140_1.dll 和 msvcp140_2.dll 文件是什么?

dll - LoadLibrary() 无法使用 list 和私有(private)程序集加载 DLL