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

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

> LibA是一个静态库,静态运行时链接,msvc 8.0
> LibB是一个静态库,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,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是不可取的)?

我知道在this questionthis one中提出的想法.在这里我最感兴趣的是这个具体问题,如果有办法可以避免它.

任何见解将不胜感激.

解决方法

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

您可以更改API,也可以使用相同的编译器重建所有项目.

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

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...