繁体   English   中英

如何避免 Windows 上多个 CRT 版本的问题(重新访问 dll 地狱?)

[英]How to avoid problems with multiple CRT versions on Windows (dll hell revisited?)

我很感激之前有人问过类似的问题 - 但是阅读它们都没有完全解决我们的问题,所以我想我会要求任何见解。

[TL;DR] 版本:

是否可能/容易为 VS2005 CRT 创建一个 shim dll,然后将所有调用委托给 VS2013 CRT?

将 VS2013 版本降级以使用 VS2005 CRT 是否更容易?

或者这两个想法都是疯狂的?

我们的情况:

我们的 C++ 应用程序是使用现代版本的 C++ 编译器(VS2013、gcc 4.8,具体取决于目标平台)构建的——我们使用的一些依赖项将需要现代版本,因为它们使用 C++11。

我们的应用程序还使用运行时链接(.dll 或 .so)来打包各种应用程序组件。

在 Windows 上,为了让生活变得简单,我们使用 /MD(或 /MDd 进行调试)进行编译,即在使用多线程版本的 dll 中使用 CRT - 我们构建的任何依赖项都被重新编译为使用相同的 CRT。

对所有依赖项(在单独的 dll 中)使用相同的 CRT 意味着我们可以避免在一个 dll 中分配内存并在另一个 dll 中释放内存时出现问题,因为使用了相同的堆。

我们的问题

我们有一个由 3rd 方提供的依赖项(我不会在这里命名和羞辱它们 - 但你知道你是谁!)作为预编译的 dll/so 而不是源。

这是在 Windows 上使用 VS2005 (MSVC8) 编译的,并使用 MSVC8 crt。

他们以前版本的这种依赖关系很好。 他们对该依赖项的 api 正确处理了内存的分配和取消分配,因此即使它对我们应用程序的其余部分使用不同的 CRT 版本,也没有问题。

不幸的是,他们的新(“改进”!)版本在他们的 api 中大量使用了 C++ 模板——这些模板在我们的调用代码中扩展并导致尝试从我们的调用代码中删除在他们的 dll 中分配的内存。 由于这两个区域使用不同的堆,这是非常有问题的。

可能的解决方案:

为了解决这个问题,我们可以看到以下可能的解决方案

1]让供应商重写(我们已经要求这样做,这是长期解决方案,但不会在一段时间内发生)

2]让供应商使用 VS2013 重新编译,这样我们双方都有相同的 CRT(显然不会发生 - 已经问过)。

3]对我们所有的代码使用 VS2005 CRT(我们不能简单地使用 VS2005 来构建我们的代码,因为我们需要 C++11 支持)

4]填充第 3 方 dll 期望的 VS2005 CRT - 即构建看起来像 VS2005 CRT 但实际上使用 VS2013 CRT 的东西。

5]包装第 3 方 dll - 即构建一个用 VS2005 编译的 dll,其中包含对第 3 方依赖项的所有调用 - 并提供正确的内存处理,以便它与我们的其他(使用 VS2013 CRT)dll 一起使用

最后是问题:

选项 5] 可能是最多的工作(但成功的可能性最大)——它基本上是选项 1],但在我们的控制之下,所以我们不必等待第 3 方。

在开始这条路线之前,虽然我想我会问一下其他人是否做了类似于 3] 或 4] 的任何事情,或者我们没有想到的其他一些解决方案。

选项 4](构建 CRT 的垫片版本)似乎可能是最简单的,因为我想很多向后兼容的工作已经在 VS2013 CRT 中完成了 - 所以只是找出细节并支持 2005调用 2013 版本的版本 - 在许多情况下,我想甚至签名是相同的,所以只是一个 implib 条目。

然而,当我通过谷歌查看时,我找不到任何人为 CRT 版本不兼容问题构建 shim dll 的示例 - 所以它可能比我想象的要困难得多(或者我的 google fu 严重缺乏)。

所以想我只是问是否有人做过类似的事情/知道为什么这是一个非常愚蠢的想法?

没有合理的方法可以实现这种匀场。

破坏者是 STL 实现已经改变,而那些是模板。 几乎可以肯定,DLL 混合了对 VS2005 STL 的内联和非内联调用。 如果将 VS2005 换成 VS2013 CRT,它们的 DLL 将混合使用内联 VS2005 和非内联 VS2013 调用。 一场注定的灾难。 那是假设 VS2013 CRT 甚至具有所需的非内联版本。

也就是说,您可以在代码中提供自己的newdelete 这些可以转发到您在运行时通过GetProcAddress检索的相应 VS2005 版本。 或许是足够的-没有任何保证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM