4

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

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

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

谢谢你。

4

2 回答 2

5

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 会自动恢复它。这也是您不应该听从福伊特建议的原因。

于 2013-07-26T14:55:27.597 回答
3

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

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

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

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

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

于 2013-07-26T14:18:26.683 回答