除了增加二进制文件的大小外,使用动态链接VC CRT的一些重要原因是什么?
保持安全补丁的最新状态是一个很好的理由。否则,您需要重新构建带有修复CRT的应用程序并将其部署到您的客户端。
使用共享CRT应该会减少系统的内存占用,因为大多数DLL页面可以在进程之间共享。
我更喜欢静态链接。从安全角度考虑,黑客攻击的目标是那些已经安装在很多用户系统中的应用程序。所以,除非你的应用程序有超过100万用户,否则不必担心被黑客利用。
我不喜欢动态链接。它给我的感觉太脆弱了。
编辑:如果您想确保用户使用的是最新版本的应用程序,还应编写一个更新程序与主应用程序一同自动安装。在Windows上,这可以实现为服务。
如果做得好,动态链接应该没有任何问题,应用程序也不会运行失败。唯一困难的部分是从现在使用的方法切换到微软支持的方式(可重新分发的合并模块-MSM、MSI、动态链接)来构建您的安装程序。请参见this link,获取来自源头的极其宝贵的建议。以下是博客中的一些有趣的引用:
- 为了重新分发Visual C++库,所有你需要做的就是包含相应的.MSM文件及其附带的策略.MSM以分发所需的库。
- 再次强调 - 除非您正在使用Click Once来部署应用程序,否则不要使用VCRedist*.exe。
- 然而,我想不出任何情况下(我的注释:静态链接)这实际上是将产品发送给客户时正确的做法。
我确实同意你可能需要做一些非平凡的工作来实现这一点(也许你现在没有使用MSI等),但我认为如果资源允许,您应该尝试切换到上述推荐方法。
而且,如果您不按照上述描述的方式执行,则您的应用程序确实会在某些时候停止工作。开发人员指责微软,而他们实际上并未遵循上述支持的方式。也许微软应该承担责任,因为它没有在MSDN上更频繁地链接到上面的博客以传播信息,但仅此而已。
当你的程序使用 CRT 中的某些东西时,这就是你提到的“安全漏洞”之一。如果你静态链接,你的用户将不会知道他们受到了安全漏洞的影响,可能会面临病毒的危险。另一方面,如果你的程序因为动态链接而无法工作,他们将被迫更新到新的安全版本。
在Windows上你很幸运。而Linux则是由库构成,你会遇到各种问题。 :-)
据我所知,库供应商总是保留向后兼容性,特别是微软。因此,可能的解决方案是在旧机器上构建您的应用程序,记住微软开发CRT库的方式,以便您的应用程序将在所有后续版本上运行。