当我使用 VS2013 编译时,链接到使用 VS2010 编译的静态 .lib?

Jam*_*zba 1 c++ visual-studio-2010 visual-studio visual-c++ visual-studio-2013

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

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

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

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

Jes*_*uhl 5

或多或少; 是的。

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

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

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

没有标准化的 C++ ABI。

  • 这里的一种选择是使用 VS 2010 工具集创建一个 DLL,该 DLL 将您对该静态库的使用包装在 C 可调用函数中,然后您的主应用程序可以使用该 DLL 而不是静态库,因为 DLL 确实具有良好的 -定义的 ABI。 (3认同)
  • 不。我的意思是 A**B**I - 就像在“应用程序 **二进制** 接口”中一样。C++ 没有标准化的。这意味着您不能依赖由不同编译器(或什至相同的不同次要版本)编译的对象是二进制兼容的(可链接、可调用)。这意味着为了获得正确的结果,您*必须*为最终结果(二进制或库)的*所有*组件使用相同的编译器/链接器/选项 - 您不能混合和匹配。 (2认同)