静态链接VC CRT的原因是什么?

3
我发现使用动态链接,即使使用SxS,Windows更新也会覆盖VC8 CRT的某个版本(例如它存在安全漏洞),然后我的应用程序将无法在旧版本上运行。
除了增加二进制文件的大小外,使用动态链接VC CRT的一些重要原因是什么?

你是说你的程序加载(或尝试加载)了带有安全修复的更新CRT,但由于与更新的CRT不兼容而无法正常工作? - Michael Burr
6个回答

5
  • 保持安全补丁的最新状态是一个很好的理由。否则,您需要重新构建带有修复CRT的应用程序并将其部署到您的客户端。

  • 使用共享CRT应该会减少系统的内存占用,因为大多数DLL页面可以在进程之间共享。


如果您的应用程序有多个DLL,您可以在一个DLL中释放由另一个DLL malloc的内存,因为它们将共享运行时实例和一个堆。如果您尝试使用每个(或某些)链接到静态CRT的模块进行此操作,则会出现与堆相关的错误。 - Adrian McCarthy

2

我更喜欢静态链接。从安全角度考虑,黑客攻击的目标是那些已经安装在很多用户系统中的应用程序。所以,除非你的应用程序有超过100万用户,否则不必担心被黑客利用。

我不喜欢动态链接。它给我的感觉太脆弱了。

编辑:如果您想确保用户使用的是最新版本的应用程序,还应编写一个更新程序与主应用程序一同自动安装。在Windows上,这可以实现为服务。


1

1

如果做得好,动态链接应该没有任何问题,应用程序也不会运行失败。唯一困难的部分是从现在使用的方法切换到微软支持的方式(可重新分发的合并模块-MSM、MSI、动态链接)来构建您的安装程序。请参见this link,获取来自源头的极其宝贵的建议。以下是博客中的一些有趣的引用:

  • 为了重新分发Visual C++库,所有你需要做的就是包含相应的.MSM文件及其附带的策略.MSM以分发所需的库。
  • 再次强调 - 除非您正在使用Click Once来部署应用程序,否则不要使用VCRedist*.exe
  • 然而,我想不出任何情况下(我的注释:静态链接)这实际上是将产品发送给客户时正确的做法。

我确实同意你可能需要做一些非平凡的工作来实现这一点(也许你现在没有使用MSI等),但我认为如果资源允许,您应该尝试切换到上述推荐方法。

而且,如果您不按照上述描述的方式执行,则您的应用程序确实会在某些时候停止工作。开发人员指责微软,而他们实际上并未遵循上述支持的方式。也许微软应该承担责任,因为它没有在MSDN上更频繁地链接到上面的博客以传播信息,但仅此而已。


0

当你的程序使用 CRT 中的某些东西时,这就是你提到的“安全漏洞”之一。如果你静态链接,你的用户将不会知道他们受到了安全漏洞的影响,可能会面临病毒的危险。另一方面,如果你的程序因为动态链接而无法工作,他们将被迫更新到新的安全版本。


我看到的问题是,我有一个应用程序,它是动态链接到较新版本的CRT构建的。当我在另一台安装了旧版本的机器上部署它时,它无法运行,因为依赖关系在于较新版本。微软已经更新了CRT,但似乎它不包含在可再发行的软件包中,而是作为安全更新的一部分。因此,如果客户或用户拒绝运行补丁程序,他们将无法运行该应用程序,因为他们无法在计算机上安装新的CRT。我在这里错过了什么? - Leeks and Leaks

0

在Windows上你很幸运。而Linux则是由库构成,你会遇到各种问题。 :-)

据我所知,库供应商总是保留向后兼容性,特别是微软。因此,可能的解决方案是在旧机器上构建您的应用程序,记住微软开发CRT库的方式,以便您的应用程序将在所有后续版本上运行。


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