我可以将不同的Visual C++运行时与静态库混合使用吗

Can I mix different Visual C++ runtimes with a static library?

本文关键字:静态 混合 运行时 C++ Visual 我可以      更新时间:2023-10-16

关于此堆栈;溢出问题:在一个进程中混合和匹配Visual C++运行时DLL文件有多糟糕

我知道在运行时使用不同版本的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之间发生变化,我是否可以预期未定义的行为

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

我引用(Visual C++2003-2015年的更改历史):

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

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