首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用VC10编译的VC10库(sp1)可以通过VC11编译的代码链接吗?

用VC10编译的VC10库(sp1)可以通过VC11编译的代码链接吗?
EN

Stack Overflow用户
提问于 2012-04-03 15:04:02
回答 4查看 4.9K关注 0票数 4

问题就说明了一切。

我知道VC11目前只处于测试版,但我想问的是:

  1. 尝试连接使用vc10编译的封闭源代码(如果可能的话广泛使用)库的经验
  2. 微软的规范明确地说,如果是或否,vc11将能够链接到vc10库。

我说的只是C++的案子。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-03 15:16:06

您可能希望阅读这个答案,以了解动态链接的情况。

关于静态链接,我认为您不能安全地将用VCx编写的C++库与用VCy编译的代码连接起来。例如,STL容器实现在不同版本之间发生变化(即使在同一版本中,调试和发布模式与_HAS_ITERATOR_DEBUGGING等设置之间也有变化)。

引用VC++ STL保持器

STL从来没有也永远不会保证不同主要版本之间的二进制兼容性。当使用不同的主要版本编译的对象文件/静态库混合时,我们使用链接器错误强制执行此操作,这两个版本都是VC10+ .

票数 3
EN

Stack Overflow用户

发布于 2012-04-03 15:27:04

对于动态库,应该没有问题,因为它们遵循定义良好的ABI。您可以在任何时间从任何编译器链接到dll。

静态库更复杂。据我所知,微软从未保证过跨编译器的兼容性。特别是,链接时代码生成这样的特性已知会破坏早期版本之间的兼容性。.lib文件没有像DLL那样定义良好的单一格式。

它可能会起作用,因为微软很少破坏兼容性,除非他们必须这样做,但据我所知,这并不能保证兼容性。

当然,如果‘ll公开的实际函数和类型不匹配,就会遇到问题。

在VC11中,几乎所有标准库数据结构的大小都已经改变(微软最终采用了空基类优化,有效地减少了使用默认分配器的所有容器的大小。)因此,尝试将std::string从用VC10编译的DLL传递到VC11编译的模块肯定会失败。

票数 1
EN

Stack Overflow用户

发布于 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自动化模型就是一个例子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9996076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档