Visual Studio交叉链接DLL由不同的VC编译器构建

时间:2017-01-26 02:36:56

标签: visual-studio c++11 dll visual-studio-2013 visual-studio-2015

将项目与使用不同版本的工具集兼容构建的库链接。当我在VS2015 / 2013之间尝试这个时,C ++链接器抱怨MSVC_version不同。

error LNK2038: mismatch detected for '_MSC_VER': value '1900' doesn't match value '1800'
  • 我做错了什么或这是预期的行为?

  • 如果这是预期的,由于编译器生成特定于平台的代码,为什么不允许这样做?我提出的一个例子是,如果C ++ 11将int定义更改为64位宽而不是C + +03抱怨旧的编译器只有32位。但似乎仍然可以使用智能编译器/链接器选项吗?

最后,当我尝试使用一个使用C ++ 11功能的开源库时,我偶然发现了这一点。但是我的很多项目现有代码都是在2013年。无论如何使用库功能完全升级我的项目?我确信我遗漏了一些东西,因为很多lib应该像api库一样独立工作,在旧的windows机器上安装旧的驱动程序等等。我错过了什么?

- 谢谢你。

2 个答案:

答案 0 :(得分:3)

在编译器版本之间可能会发生许多微妙的变化,导致它们不兼容。

  • 基类的顺序。
  • 具有不同访问说明符的成员变量的顺序。
  • 结构填充。
  • 标准库类的实现,例如std::vector
  • 非内联基元的内部实现辅助函数,例如移位32位系统上剩余的64位整数。
  • RTTI,stack probesGSCFG等功能的内部实施助手功能。
  • LTCG目标文件的内部格式。

任何这些都会导致由一个版本的编译器编译的目标文件与由不同版本的编译器编译的目标文件不兼容。其中一些不兼容性会导致链接错误,但其他一些会导致可执行文件显示出神秘的运行时错误。

答案 1 :(得分:2)

没有普遍的ABI'对于C / C ++,但只要确保它们使用一致的调用约定,您通常可以在英特尔平台上获得C风格的导出以链接到英特尔平台上的其他C风格导出。如果他们使用相同的名称修改方案,您可以获得一些C ++代码来链接来自不同编译器的其他C ++代码 - 英特尔会努力使其编译器与Visual C ++链接兼容。

这当然都是内联代码,特别是标准C ++库不能保证匹配。链接错误是因为Visual C ++仅在相同版本(即Update 1到Update 2)中维护编译器/标准库兼容性,但在主要版本(VS 2013到VS 2015)之间不兼容。

  

请注意,对于VS 2017,C / C ++库实际上与VS 2015版本相同。