从不同的Visual C ++版本冲突stl

时间:2010-12-28 00:14:03

标签: visual-c++ dll stl

我有一个用VC ++ 7.1(VS2003)编译的封闭可执行文件(没有源代码)。 这个可执行文件加载了一个我拥有源代码的DLL。

我试图避免使用VS2003工具包编译此DLL,因为它涉及在我想要编译它的每台机器上安装此工具包,并使用makefile而不是直接使用较新的VS项目。

我更改了运行时库之类的参数(我使用/ MT代替/ MD来防止运行时DLL冲突)和一些其他语言切换以保持与旧编译器的兼容性。最后,它与VS2005库进行了编译和链接。

但是当我尝试运行它时,它就崩溃了。原因是:DLL将一个std :: string(以及其他地方 - 一个std :: vector)发送回exe,而冲突的STL实现版本会导致一些不好的事情发生。

所以我的问题是:有办法解决它吗?或者我应该继续使用VC7.1工具包编译DLL吗?

我不是很乐观,但也许有人会对此有个好主意。

感谢。

1 个答案:

答案 0 :(得分:0)

随着stl库的实现发生变化,会破坏二进制兼容性,这是(据我所知)对象的大小/成员变量发生变化时。双方不同意std :: string / vector / etc的大小。

如果旧的可执行文件认为std :: string是32bit char * ptr,32bit size_t length,并且新的可执行文件认为std :: string是64位迭代器* iterator_list,64bit char * ptr,64bit size_t length,然后他们不能来回传递字符串。这就是长期格式(windows,bmp)第一个成员是32位size_of_object的原因。

长话短说,您需要较旧的VS2003版本的库(我认为您不一定需要编译器)