msvcr100相对于msvcrt的优势

5

我想问一下msvcr100与msvcrt相比是否有优势,如果有的话,那么这些优势是什么。

当使用msvc编译器进行编译时,我得到的可执行文件链接到了msvcr100,因此需要安装MS Visual C++ Redistributable才能运行。如果我使用g ++(mingw)进行编译,则没有此要求。我猜它链接到msvcrt而不是msvcr100。

我更喜欢尽量减少依赖关系,所以我想知道使用链接到mscvr100的编译器是否有任何意义。

谢谢。


使用mingw并不能免除您必须提供msvcrt.dll的要求,详见Should I redistribute msvcrt.dll with my application? - Ben Voigt
2
@BenVoigt 长久以来,msvcrt.dll 一直是系统 DLL。您可以像依赖于 user32.dll、kernel32.dll 等一样依赖它的存在。 - David Heffernan
2个回答

6

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

当你发现你使用CRT的方式可能会在特定的Windows版本上失败时,你会感到非常头疼。新版本的Windows可能会有一个新的msvcrt.dll副本,这会导致程序失败。这个问题通常被称为DLL地狱。

使用msvcr100.dll的好处是出现这种情况的几率要小得多。你使用已知版本的CRT。即使Windows本身有一个破坏性的更改破坏了msvcr100.dll,那么仍然有解决办法:更新它。这对于msvcrt.dll来说是不可能的,因为它是由文件系统保护功能覆盖的DLL。用安装程序覆盖它通常会非常灾难性,因为这会破坏Windows本身。但它不会导致失败,Windows会自动恢复它。这也是你不应该遵循Voith的建议的原因。


4
如果您使用的MS编译器版本大于6,则必须链接到特定于该编译器的运行时。这是没有选择的。由于MSVC运行时不是系统DLL,因此您需要将它们随应用程序一起分发。
如果您使用MSVC6或可以链接到msvcrt.dll的编译器,则可以链接到msvcrt.dll。
Mingw编译器非常可配置。但是,我认为通常它会链接到msvcrt.dll。由于msvcrt.dll是系统DLL(自Windows 2000时期以来),因此您无需分发它。
我假设在所有这些情况下,您都会动态链接到运行时。这是首选选项,但始终可以静态链接到运行时。这样做可以使应用程序独立。
所有这些都归结为您喜欢使用哪个编译器。如果您喜欢使用现代的MSVC,则需要接受运行时分发或进行静态链接。

你有什么想法,为什么MSVCR库不是系统DLL?很明显,这些MSVCR库迟早会在任何Windows机器上需要... - cubuspl42
Windows和VS团队在微软是分开的。我猜这样他们更容易避免相互依赖。这样两个团队都会取得更好的进展。此外,如果一个新版本的CRT如何出现在早于该CRT的Windows版本上呢?例如,VS12的运行时如何出现在XP、Vista或7上? - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接