Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不静态链接到VC CRT的原因有哪些?_C++_Visual Studio_Visual Studio 2008_Visual C++ - Fatal编程技术网

C++ 不静态链接到VC CRT的原因有哪些?

C++ 不静态链接到VC CRT的原因有哪些?,c++,visual-studio,visual-studio-2008,visual-c++,C++,Visual Studio,Visual Studio 2008,Visual C++,我发现,使用动态链接,即使使用SxS,Windows Update也会出现,并在VC8 CRT版本上跺脚(例如,它有安全缺陷),然后我的应用程序将无法在旧版本上运行 除了增加二进制文件的大小外,使用VC CRT动态链接的一些重要原因是什么?当您的程序使用CRT中的某个内容时,这是您提到的“安全漏洞”之一。如果你静态链接,你的用户将不知道他们受到安全漏洞的影响,并且可能有病毒的危险。另一方面,如果您的程序由于动态链接而无法工作,则将被迫更新到新的安全版本。 及时更新安全补丁是一个很好的理由。否则,

我发现,使用动态链接,即使使用SxS,Windows Update也会出现,并在VC8 CRT版本上跺脚(例如,它有安全缺陷),然后我的应用程序将无法在旧版本上运行


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

当您的程序使用CRT中的某个内容时,这是您提到的“安全漏洞”之一。如果你静态链接,你的用户将不知道他们受到安全漏洞的影响,并且可能有病毒的危险。另一方面,如果您的程序由于动态链接而无法工作,则将被迫更新到新的安全版本。

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

  • 使用共享CRT应该会降低系统的内存占用,因为DLL的大部分页面可以在进程之间共享

参见


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

在Windows中你很幸运。Linux实际上是由库组成的,所有库都有这样的问题。:-)


据我所知,库供应商总是保持向后兼容性,尤其是在微软的情况下。因此,可能的解决方案是在旧机器上构建应用程序,请记住Microsoft开发CRT库的方式将使您的应用程序在所有后续版本上运行。

我更喜欢静态链接。安全性并不是一个真正的大问题,因为黑客攻击的目标是许多用户在其系统上安装的应用程序。所以,除非你的应用程序有超过100万的用户,否则我不会担心它被黑客利用

我不喜欢动态链接。我觉得它太脆弱了


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

如果操作正确动态链接应该绝对没有问题,应用程序也不会无法运行。唯一困难的部分是从现在使用的任何方法转换到Microsoft支持的方法(可再发行的合并模块-MSM、MSI、动态链接)来构建安装程序。请参阅,从源头获得极其宝贵的建议。博客中一些有趣的引语:

    <> LI>为了重新分配VisualC++库,<强> >所有您需要包括适当的.MSM文件及其附带的策略.MSM来分发所需的库。
  • 再次强调–不要使用vcredit*.exe,除非您使用单击一次来部署应用程序
  • 然而,我可以想到在向客户运送产品时,这(我的注释:静态链接)实际上是正确的做法
我同意你可能需要做一些非琐碎的工作来实现这一点(也许你现在没有使用MSI等等),但我认为如果资源允许,你应该尝试切换到上述推荐的方法


如果你不按照上面描述的方法去做,你的应用程序确实会在某个时候停止工作。开发人员指责微软,因为他们实际上没有遵循上述受支持的方式。也许微软应该受到责备,因为它没有更多地在MSDN上链接到上面的博客来传播消息,但仅此而已。

你是说你的程序加载(或尝试)更新的CRT并进行安全修复,但是,由于与更新的CRT不兼容,它无法工作?我看到的问题是,我有一个应用程序,它可以动态链接到更新的CRT版本。当我在另一台旧版本的机器上部署它时,它不会运行,因为依赖关系在新版本上。微软已经更新了CRT,但它似乎不在可再发行软件包中,而是作为安全更新的一部分。因此,如果客户或用户拒绝运行修补程序,他们将无法运行应用程序,因为他们无法在计算机上安装新的CRT。我错过了什么。如果您的应用程序有多个DLL,您将能够释放一个DLL中被另一个DLL占用的内存,因为它们将共享一个运行时实例和一个堆。如果您对链接到静态CRT的每个(或某些)模块都尝试此操作,则会出现与堆相关的错误。