有什么理由不静态链接到VC CRT?

时间:2009-08-26 22:40:05

标签: c++ visual-studio visual-studio-2008 visual-c++

我发现通过动态链接,即使使用SxS,Windows Update也会出现并踩踏一个版本的VC8 CRT(例如它有一个安全漏洞)然后我的应用程序无法运行旧版本

除了增加二进制文件的大小之外,保持与VC CRT动态链接的一些重要原因是什么?

6 个答案:

答案 0 :(得分:4)

  • 及时了解安全修复程序是一个很好的理由。否则,您负责使用固定CRT重建您的应用程序并将其部署到您的客户。

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

答案 1 :(得分:2)

我更喜欢静态链接。由于黑客攻击许多用户在其系统上安装的应用程序,因此安全性不是一个很大的问题。因此,除非您的应用程序拥有超过100万用户,否则我不担心它会被黑客利用。

我不喜欢动态链接。这对我来说太脆弱了。

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

答案 2 :(得分:1)

请参阅http://people.redhat.com/drepper/no_static_linking.html

这是关于linux的,但有些想法适用。

答案 3 :(得分:1)

如果做得好,动态链接应该绝对没问题,应用程序应该无法运行。唯一困难的部分是切换到从现在使用的任何方法构建安装程序到Microsoft支持的方式(可再发行的合并模块 - MSM,MSI,动态链接)。请参阅this link,了解非常宝贵的建议。一些有趣的引用来自博客:

  
      
  • 为了重新分发Visual C ++库,所有,您需要做的是包含相应的.MSM文件及其附带的策略.MSM以分发您需要的库。
  •   
  • 再次强调 - 不要使用VCRedist * .exe ,除非您使用Click Once部署应用程序。
  •   
  • 但是,我可以想到无方案,其中(我的注释:静态链接)在将产品发送给客户时实际上是正确的做法。
  •   

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

如果你不按上述方式进行操作,你的应用程序确实会在某个时候停止工作。开发人员指责微软,他们实际上没有遵循上述支持的方式。也许微软应该受到指责,因为它不会在MSDN上更频繁地链接到上面的博客来传播这个词,但这就是它。

答案 4 :(得分:0)

当您的程序使用CRT中的某些内容时,您提到的是“安全漏洞”之一。如果您静态链接,您的用户将不会知道他们受到安全漏洞的影响,并且可能存在病毒危险。另一方面,如果您的程序无法正常工作,因为它是动态链接的,它们将被强制更新为新的安全版本。

答案 5 :(得分:0)

在Windows中你很幸运。 Linux确实包含库,而且所有这些都存在问题。 : - )

据我了解,库供应商始终保持向后兼容性,特别是如果它是Microsoft。因此,可能的解决方案是在旧机器上构建应用程序,请记住Microsoft以您的应用程序将在所有其他版本上运行的方式开发CRT库。