CRT,我们还需要重新分发它吗?

4

当我们分发Windows原生应用程序时,我们是否仍需要担心vcredist.exe?Win-7中是否有任何捆绑的内容?

如果没有,那么为什么这些库不通过Windows更新等方式发送给用户,而是让我们负担着必须工作的另一件事情呢?(好吧,这可能听起来很争论,但我真的很想知道为什么这些库不是默认安装/更新在Windows机器上)


1
并非每个人都运行Windows更新。 - RichieHindle
4个回答

2
我认为这取决于您连接到的方式/内容。如果您直接链接到kernel32.dll等,则当然没有问题(即嵌入了c运行时库),但是微软不推荐使用这种分发方法。
如果您通过msvcr80 / 90 / whatever 2010 is.dll链接,那么您可能需要分发该运行时库,因为XP默认没有它。 msvcr80在Vista上提供,但我不认为msvcr90有 - 尽管它可能会通过Windows更新添加。仍然,您不能依赖它存在,因此保险起见,请备份一份副本。
据我所知,mingw链接到的msvcrt.dll(vc6是否链接到此处?)随着所有> xp的内容一起分发。当时我没有VC ++。
使用Windows SDK中的depends.exe查看可执行文件,并确定它除了Windows API的部分外还包含什么。

C运行时是msvcrt.dll。它与kernel32.dll无关。但depends.exe还是很不错的。 - Billy ONeal
这是事实,但 msvcrt.dll 链接到 kernel32.dll。如果您链接到 msvcrt 的静态库版本,则直接链接到 kernel32.dll。无论如何,您都将链接到 kernel32.dll,无论您是否喜欢。我的观点是,您所依赖的内容(即您的程序要求加载的内容)取决于您的链接方式。它将通过 msvcrt、msvcrXX.dll 或静态链接到 API。 - user257111
啊——从你的回答中并不明显——你没有链接到 C 运行时库。即使你使用 C 运行时库的 DLL 版本,你仍然链接到 kernel32.dll。 - Billy ONeal
1
msvcrt.dll不是C运行时库。它是Windows的内部组件,不应该被第三方应用程序使用。你会注意到在MSDN上找不到任何使用这个DLL的参考资料。曾经有一段时间第三方应用程序使用它,但已经有大约10年没有这种情况了。 - Larry Osterman

1

是的,你需要这样做。否则,当你尝试运行程序时,它会崩溃得非常惊人。许多用户并没有运行Win7,即使他们运行了Win7,也无法确保他们已经安装了运行时库,除非你在安装程序中包含它。

或者,你可以链接到运行时库的静态构建版本,避免烦恼地处理C运行时可再发行版。


微软不鼓励使用静态链接运行时,原因是如果他们发现运行时中存在漏洞,他们可以更新dll并保护您的应用程序 - 否则您需要重新构建。我不知道msvcrt运行时中是否存在漏洞,但显然他们发布这个建议是有原因的,所以就是这样。 - user257111
@Ninefingers: 是的,但我们中的一些人无法证明强制用户安装 ~20MB 的redist包是合理的。 如果您需要单个EXE XCOPY部署,则几乎没有选择余地。 - Billy ONeal

0

在使用GCC编译时,我总是链接到MSVCRT.DLL,这个文件在XP及以上版本中始终存在。


你必须链接Microsoft的C运行时库才能使用GCC?很奇怪。 - Billy ONeal
@Billy,虽然你不需要,但是在mingw发行版中,stdio.h等文件都是为此设置的。 - Joshua
我相信这是默认行为并且很合理 - 在Linux上,您链接的是glibc。为什么不在Windows上使用Microsoft的“libc”呢?那就是它的全部,作为额外的奖励,它几乎保证会在那里。 - user257111

0

这是对Larry Osterman于4月14日23:29发表的评论的回应:

你说:

msvcrt.dll不是C运行时库。它是Windows的内部组件,不应该被第三方应用程序使用。你会注意到,在MSDN上找不到使用此DLL的任何参考资料。曾经有一段时间第三方应用程序使用了它,但已经有大约10年没有这种情况了。- Larry Osterman Apr 14 at 23:29

这似乎与基于访问msvcrt.dll的mingw系统的整个前提相矛盾,而你的评论使我更好地理解了mingw的工作原理。事实证明,mingw仍然使用1998年发布的msvcrt.dll!请参见此链接:

http://www.mingw.org/wiki/C99

谢谢,

Todd


1
msvcrt.dll现在是一个“已知DLL”,这意味着它是Windows拥有和构建的系统组件。它仅用于系统级组件的未来使用。 - Lucas
谢谢Lucas,我不知道“已知DLL”概念。不知道mingw是否能与msvcr100.dll一起使用,而不是msvcrt.dll? - Sabuncu

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