【问题标题】:Link to a static .lib compiled with VS2010 when I'm compiling with VS2013?当我使用 VS2013 编译时,链接到使用 VS2010 编译的静态 .lib?
【发布时间】:2016-11-07 12:05:37
【问题描述】:

我有第三方库,它是一个静态 .lib 文件,他们告诉我是用 VS2010 编译的。我们在 VS2013 中开发我们的应用程序,需要链接到这个库。

当我们尝试时,我们得到这个错误:

错误 C1047:对象或库文件“.../xxx.lib”是用 比其他对象更旧的编译器;重建旧对象和 图书馆

这是否意味着我们必须使用 VS2010 编译器来链接它? (我们无法获得库的重新编译版本)

【问题讨论】:

  • 请注意,切换到 VS 2015 的 Universal CRT 后,旧的静态库甚至可能根本无法与 VS 2015 链接。您应该计划在某个时候替换该黑盒库如果你不能重建它。

标签: c++ visual-studio visual-studio-2010 visual-c++ visual-studio-2013


【解决方案1】:

或多或少;是的。

通常,C++ 程序的所有部分都需要用完全相同相同的编译器(包括精确的编译器版本)进行编译和链接。

通常您还需要在构建不同部分时使用相同的编译器选项。

也有例外,但这是一般的经验法则。

没有标准化的 C++ ABI。

【讨论】:

  • 在一定程度上不仅是相同的编译器,而且是相同的选项(特别是运行时库和_ITERATOR_DEBUG_LEVEL 应该匹配)。
  • 没有。我的意思是 ABI - 就像在“应用程序 Binary 接口”中一样。 C++ 没有标准化的。这意味着您不能依赖已由不同编译器(甚至相同的不同次要版本)编译的对象来实现二进制兼容(可链接、可调用)。这意味着为了获得正确的结果,您必须对最终结果的所有组件(二进制或库)使用相同的编译器/链接器/选项 - 您不能混合和匹配。
  • 这里的一个选项是使用 VS 2010 工具集创建一个 DLL,将您对该静态库的使用包装在 C 可调用函数中,然后您的主应用程序可以使用 DLL 而不是静态作为 DLL 的库确实具有定义明确的 ABI。
  • 即使是 C 包装器也不是万无一失的——它解决了应用程序和库之间的 ABI 不匹配问题,但不能解决两者引用的 CRT 之间的不匹配问题。该库必须链接到 CRT 的静态版本,我不相信 MS 支持(例如,在 VS2013 和 VS2015 之间,CRT 在内部发生了很大变化,并且与旧版本动态链接的库不再链接到构建的应用程序反对新的而不被重新编译)。
  • @JesperJuhl 你知道微软是否提供任何解释编译器版本之间不兼容性的文档?我的搜索没有让我找到任何东西
猜你喜欢
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2023-03-03
相关资源
最近更新 更多