【问题标题】:Advantages of msvcr100 over msvcrtmsvcr100 相对于 msvcrt 的优势
【发布时间】:2013-07-26 14:12:15
【问题描述】:

我想问一下msvcr100是否比msvcrt有优势,优势是什么。

使用 msvc 编译器编译时,我得到的可执行文件链接到 msvcr100,因此它需要安装 MS Visual C++ Redistributable。如果我用 g++ (mingw) 编译它,那么就没有这样的要求。我猜它与 msvcrt 相关联。

我更喜欢将依赖关系保持在最低限度,所以我想知道使用链接到 mscvr100 的编译器是否有任何意义。

谢谢。

【问题讨论】:

  • 使用 mingw 并不能让您免于发送 msvcrt.dll,请参阅 Should I redistribute msvcrt.dll with my application?
  • @BenVoigt 很长一段时间以来,msvcrt.dll 一直是系统 DLL。您可以像依赖 user32.dll、kernel32.dll 等一样依赖它的存在。

标签: c++ visual-studio-2010 msvcrt


【解决方案1】:

Msvcrt.dll 是一个私有 DLL,仅供Windows 本身使用。不同版本的 Windows 有不同版本的 msvcrt.dll。

当您发现使用 CRT 的方式导致特定 Windows 版本出现故障时,您会非常头疼。包括需要时间机器的那种故障,新版本的 Windows 可能有一个新的 msvcrt.dll 副本,这会使您的程序失败。另一个称为 DLL Hell 的问题。

使用 msvcr100.dll 的优点是发生的几率要小得多。您使用的是 已知 版本的 CRT。即使 Windows 本身发生了破坏 msvcr100.dll 的重大更改,仍然有一个解决方案:您可以更新它。 msvcr.dll 无法做到这一点,它是文件系统保护功能涵盖的 DLL。用安装程序覆盖它通常会带来灾难性的后果,因为这可能会破坏 Windows 本身。但它不会导致失败,Windows 会自动恢复它。这也是您不应该听从福伊特建议的原因。

【讨论】:

    【解决方案2】:

    如果您使用高于版本 6 的 MS 编译器,则必须链接到特定于该编译器的运行时。在这件事上你别无选择。由于 MSVC 运行时不是系统 DLL,因此您需要将它们与您的应用程序一起分发。

    如果您使用 MSVC6 或可以链接 msvcrt.dll 的编译器,则可以链接 msvcrt.dll。

    mingw 编译器非常可配置。但是,我相信它通常会链接到 msvcrt.dll。由于 msvcrt.dll 是一个系统 DLL(从 Windows 2000 IIRC 开始),您不需要分发它。

    在所有这些中,我假设您动态链接到运行时。这是首选选项,但始终可以静态链接到运行时。当你这样做时,你的应用程序就独立了。

    这一切都归结为您更喜欢使用哪个编译器。如果您更喜欢使用现代 MSVC,则需要接受运行时分发,或静态链接。

    【讨论】:

    • 您知道为什么 MSVCR 库不是系统 DLL 吗?很明显,任何 Windows 机器迟早都会需要这些 MSVCR 库......
    • Windows 和 VS 团队在 MS 是分开的。我想他们更容易避免相互依赖。这样,两支球队都会取得更好的进步。更重要的是,新版本的 CRT 将如何进入比该 CRT 早的 Windows 版本?例如,VS12 的运行时在 XP、Vista 或 7 上会如何显示?
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 2010-12-23
    • 2015-07-23
    • 2011-02-26
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多