【问题标题】:Can I mix different Visual C++ runtimes with a static library?我可以将不同的 Visual C++ 运行时与静态库混合吗?
【发布时间】:2016-01-12 13:07:22
【问题描述】:

关于堆栈溢出问题:How bad is it to mix and match Visual C++ runtime DLL files in one process?

我知道在运行时使用不同版本的 MSVCR 可能会导致堆损坏。

但是让我们想象一下下面这种行不通的情况:

  • libA 是一个共享库,它链接到 MSVCR71
  • Exe 是我的程序,链接到 libAMSVCR100

然后我有以下依赖方案:

Exe +--> libA ---> MSVCR71
    +--> MSVCR100

那是,我知道我不应该做的事情!

但是如果现在,我使用任何使用 MSVCR71 的 Visual Studio 将 libA 编译为静态库,然后使用使用 MSCVR100 的 Visual Studio 编译我的程序 ExelibA .

然后我将有以下方案:

Exe(lib A included) ---> MSVCR100

程序(包括静态库)是否可以很好地与MSVC100 链接而没有任何问题?或者我可以期待 未定义的行为,因为 STL 的标头容易在 MSVCR71MSVC100 之间发生变化?

【问题讨论】:

  • 库不与任何东西“链接”。它只是用过时的#include 文件编译的。可能会奏效,除非你尝试过,否则你不会知道。如果你有源代码可以重新编译,那么浪费你的时间去尝试是没有意义的。
  • 听起来您在运行时的 71 和 100 版本之间混合了 STL 和标准库类型 - 不要指望这会起作用。如果您的库不共享任何标准库类型和服务(例如内存分配),那么您应该没问题。如果你有代码,省去你的痛苦,只需将所有内容重新编译到一个目标运行时。

标签: c++ visual-studio runtime-error


【解决方案1】:

我终于在 MSDN 上找到了答案……

我引用(Visual C++ change history 2003 - 2015):

为避免难以检测和诊断的运行时错误,我们 建议您永远不要静态链接到以前的二进制文件 使用不同版本的编译器编译。另外,当你 升级 EXE 或 DLL 项目,确保升级库 它链接到。如果您使用 CRT(C 运行时)或 STL(标准模板 库)类型,不要在二进制文件(包括 DLL)之间传递它们 使用不同版本的编译器进行编译。

因此,最好使用相同的编译器重新编译所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 2011-02-26
    • 2013-01-22
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多