问题就说明了一切。
我知道VC11目前只处于测试版,但我想问的是:
我说的只是C++的案子。
发布于 2012-04-03 15:16:06
您可能希望阅读这个答案,以了解动态链接的情况。
关于静态链接,我认为您不能安全地将用VCx编写的C++库与用VCy编译的代码连接起来。例如,STL容器实现在不同版本之间发生变化(即使在同一版本中,调试和发布模式与_HAS_ITERATOR_DEBUGGING等设置之间也有变化)。
引用VC++ STL保持器
STL从来没有也永远不会保证不同主要版本之间的二进制兼容性。当使用不同的主要版本编译的对象文件/静态库混合时,我们使用链接器错误强制执行此操作,这两个版本都是VC10+ .
发布于 2012-04-03 15:27:04
对于动态库,应该没有问题,因为它们遵循定义良好的ABI。您可以在任何时间从任何编译器链接到dll。
静态库更复杂。据我所知,微软从未保证过跨编译器的兼容性。特别是,链接时代码生成这样的特性已知会破坏早期版本之间的兼容性。.lib文件没有像DLL那样定义良好的单一格式。
它可能会起作用,因为微软很少破坏兼容性,除非他们必须这样做,但据我所知,这并不能保证兼容性。
当然,如果‘ll公开的实际函数和类型不匹配,就会遇到问题。
在VC11中,几乎所有标准库数据结构的大小都已经改变(微软最终采用了空基类优化,有效地减少了使用默认分配器的所有容器的大小。)因此,尝试将std::string
从用VC10编译的DLL传递到VC11编译的模块肯定会失败。
发布于 2012-04-03 15:39:14
这是一个响亮的不!VS的每个主要版本都有一个新版本的动态CRT,名称是msvcr90.dll ( VS2008 ),msvcr100.dll ( VS2010 ),msvcr110.dll ( VS11 )。
在从导出函数返回诸如std::string之类的/MD对象时,使用动态CRT ( C++编译选项)非常重要,或者返回任何需要客户端代码删除的指针。这只能在客户端代码使用与DLL完全相同的CRT版本时才能正常工作。隐含的是,当这些代码块对msvcrXXX.dll版本有各自的依赖时,情况就不会是这样了,它们不可避免地会有不兼容的CRT版本,这些版本不共享相同的堆分配器。
您可以编写任何CRT版本都可以安全使用的DLL,但这需要精心制作API,以便这些依赖项不存在。COM自动化模型就是一个例子。
https://stackoverflow.com/questions/9996076
复制相似问题