【问题标题】:Which VC++ runtime version do I choose - static or dynamic?我应该选择哪个 VC++ 运行时版本——静态的还是动态的?
【发布时间】:2009-11-10 09:51:27
【问题描述】:

我正在开发一个 64 位进程内 VC++ ATL COM 服务器,它基本上只是将所有调用重定向到进程外 COM 服务器。所以我的 COM 服务器基本上什么都不做。

最初它在 DLL 中使用 C++ 运行时(/MD 编译器开关)。我注意到,当我在干净的 64 位 Win2k3 regsvr32 上部署它时出现错误:LoadLibrary({fileName}) failed – 此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。

Google 提供帮助 - 问题是未安装 VC++9 运行时。即使 msvcr90.dll 与我的 COM 服务器位于同一目录中,问题仍然存在。我猜这是因为搜索依赖库的工作方式 - 它不会查看同一个目录,我需要 Windows\System32 等中的 msvcr90.dll 。由于这对我的部署来说很复杂,我转而使用静态链接的 C++ 运行时(/MT 编译器开关)。现在它部署得很好。 .dll 文件的大小仅为 110k(原为 45k),因此不会打扰我。

现在我听说了很多关于在一个进程中混合不同版本的 C++ 运行时是多么糟糕 - CRT 状态可能会被破坏,地狱可能会变得松散等等。我是否必须考虑这一点,并期望将 /MD 更改为 /MT 会出现问题,尤其是因为我不知道 COM 服务器消费者使用的是什么版本?

【问题讨论】:

    标签: c++ visual-c++ com atl 64-bit


    【解决方案1】:

    据我所知,自 VS2005 以来,静态运行时在 VS 中已被弃用。

    问题在于 Visual C Runtime 是一个并行的 dll。也就是说,它必须从c:\windows\winsxs 目录加载。这就是为什么将它放在同一目录中不再起作用的原因。

    正确的解决方案是在客户端系统上安装正确的 CRT 可再发行组件。

    更多信息请参见http://msdn.microsoft.com/en-us/library/ms235316.aspx

    这可能是正确的可再发行组件: http://www.microsoft.com/downloads/details.aspx?familyid=BD2A6171-E2D6-4230-B809-9A8D7548C1B6&displaylang=en

    安装正确的会将运行时 dll 放在 winsxs 目录中。

    【讨论】:

    • 能否提供VS2005中静态链接运行时库弃用的参考?
    • 我找不到反对静态库的参考。我的第一个断言可能是错误的。当我遇到第 3 方 dll 和 VS2005 运行时的问题时,我阅读了周围的一切,我可能合并了静态运行时库和(现在已经消失的单线程运行时库)。静态运行时库很好,但如果您将应用拆分到不同的 dll 中,可能会导致问题。
    • 好的,我知道他们不鼓励这样做,因为可能存在无法通过系统更新修复的旧库错误,但有时(分发单个 .exe)更简单不必做整个安装的、管理员权限的、并排组装的事情。库修复只是通过重新构建的 .exe 分发。
    【解决方案2】:

    应该没问题。

    静态链接基本上从库中获取所需的函数并将它们放入 DLL 的代码中(因此会增加大小)。然后它应该就像您自己在代码中编写这些函数一样工作。

    【讨论】:

    • 那么数据结构的二进制布局与运行时可能有什么不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2015-11-02
    • 2011-11-11
    • 2016-11-03
    相关资源
    最近更新 更多