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

标签 windows visual-studio visual-c++ linker

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

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

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

不知何故,这个电话:

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 header 实现吗?
2.) 有没有办法防止这些实现混用?
3.) 是否有更好的方法来配置这三个项目以进行集成(假设不希望从 msvc 8.0 移动 LibA)?

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

如有任何见解,我们将不胜感激。

最佳答案

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

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

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

关于windows - 混合来自不同版本的 Visual Studio 的库时的运行时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1947822/

相关文章:

sql - 如何通过 Visual Studio/SSDT 将外部表添加到 Azure SQL DB

c++ - Visual Studio 是否支持新的 C/C++ 标准?

windows - LoadLibraryEx(..., LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR) 加载错误 dll 的解决方法错误

windows - 如何使用 wix 创建虚拟帐户的示例

c# - wsdl.exe 能否生成与 Visual Studio 在添加 Web 引用时生成的文件相同的文件?

c# - 将项目转换为 VS 2010 时的命名空间错误

php - VC++ 2008 制作的 C++ EXE 可以在 Windows 7 上运行,但不能在 XP 上运行

windows - 如何编译要从 DMD 链接的 msvc 静态库?

windows - 如何在 Windows 7/8/8.1(尤其是 64 位)上使用未签名的驱动程序

windows - OS X 中的窗口移动和调整 API