混合来自不同版本 Visual Studio 的库时出现运行时问题

2023-12-12

我在运行使用两个不同版本的 Visual Studio 构建的项目时遇到意外的访问错误。我的一般配置如下:

  • LibA是静态lib,静态运行时链接,msvc 8.0
  • LibB是静态lib,静态运行时链接,msvc 9.0
  • 我的集成目标项目是一个msvc 9.0 COM dll,它静态链接上述库

该项目可以构建,但在运行时因某些 STL 代码中的访问冲突而崩溃。堆栈似乎表明我在调用流插入运算符期间已传递了两个版本(8 和 9)的标头。我意识到这是一个问题。

不知何故,这个电话:

ost << std::dec << port_; //(originating from an object in LibA)

...通过以下堆栈跟踪下降:

std::basic_ostream::operator<<(...) (ostream:283, msvc 8.0 version <-- expected, since LibA was built with this version)
std::num_put::put(...) (xlocnum:888, msvc 8.0 version <-- expected, since LibA was built with this version)
std::num_put::do_put(...) (xlocnum:1158, msvc 9.0 version!! !@#$!%! <-- not expected, since LibA was built with msvc 8.0)
std::ios_base::flags() (xiosbase:374, msvc 9.0 version <-- follows from above)

访问冲突发生在 std::ios_base::flags() 中。我怀疑这是由于调用堆栈中的实现混合造成的(尽管我不确定)。

我的问题是。

1.) 导致此访问冲突的可能原因是 msvc 标头实现的混合吗?
2.) 有没有办法防止这些实现混合?
3.) 是否有更好的方法来配置这三个项目以进行集成(假设从 msvc 8.0 移动 LibA 是不可取的)?

我知道中提出的想法这个问题 and this one。在这里我最感兴趣的是这个具体问题,以及是否有某种方法可以避免它。

任何见解将不胜感激。


您不能在同一个项目中使用不同的 STL 实现。这意味着甚至来自同一编译器的不同版本。如果您的 LibA 有一个接受 std::vector 作为参数的函数,则只允许从构建 LibA 的 STL 传递矢量对象。这就是许多 C++ 库仅公开 C API 的原因。

要么更改 API,要么使用相同的编译器重建所有项目。

你正在做一些你不应该做的事情。你正处在一个行为未定义的世界里。尝试调试这个特定的崩溃是没有意义的。即使您设法使这条线路正常工作,您也会在其他地方遇到新的崩溃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合来自不同版本 Visual Studio 的库时出现运行时问题 的相关文章

随机推荐