【发布时间】:2010-12-29 04:51:40
【问题描述】:
我在运行使用两个不同版本的 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, 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 是不可取的)?
我知道this question 和this one 中提出的想法。这里我最感兴趣的是这个具体问题,如果有什么办法可以避免。
我们将不胜感激。
【问题讨论】:
标签: windows visual-studio visual-c++ linker