VS2010和VS2012之间的二进制C++库兼容性
Binary C++ library compatibility between VS2010 and VS2012?
我对VS2010和VS2012之间编译库的二进制兼容性感到困惑。我想迁移到VS2012,但是许多仅限二进制的开源SDK只适用于VS2010,例如用于连接硬件设备的SDK。
传统上,据我所知,Visual Studio对编译器版本非常挑剔,在VS2010中,您无法链接到为VS2008编译的库。
我现在感到困惑的原因是,我正在迁移到VS2012,我尝试了一些项目,令我最惊讶的是,其中许多项目可以跨版本工作,没有任何问题。
注意:我不是在谈论v100模式,据我所知,它只是VS2010编译引擎之上的VS2012 GUI
我说的是在VS2012中打开一个VS2010解决方案,点击更新,看看会发生什么。
当链接到一些更大的库(如boost)时,编译不起作用,因为会检查编译器版本,它们会引发错误并中止编译。其他一些库只是在缺少函数时中止。这是我所期望的行为。
另一方面,许多库运行良好,没有任何错误或附加警告。
这怎么可能?VS2012是否以一种特殊的方式与VS2010库保持二进制兼容性?它依赖于动态链接还是静态链接?
最重要的问题是:即使在编译时没有出现错误,我能相信编译器在将VS2012项目链接到VS2010编译库时不会有任何错误吗?
"许多库运行良好。这怎么可能?"
1) lib被编译为使用静态RTL,因此代码不会引入第二个发生冲突的RTL DLL。
2) 代码只调用完全在头文件中的函数(和使用结构等)因此不会导致链接器错误,或者调用新RTL中仍然存在的函数,因此不会导致链接器错误,
3) 不调用任何具有已更改布局或意义的结构的对象,因此不会崩溃。
#3是需要担心的。您可以使用导入来查看它使用了什么,并制作一个完整的列表,但没有文档或保证哪些是兼容的。仅仅因为它似乎在运行并不意味着它没有潜在的bug。
也有可能
4) 驱动程序SDK或其他相当低级别的代码是为了避免完全使用标准库调用而编写的。
而且(我认为不是你的情况)DLL可以被隔离,并有自己的RTL,而不是在不同的机制之间来回传递东西(比如内存分配和释放)。进程中的COM服务器就是这样工作的。DLL通常可以做到这一点,如果你小心你传递和返回的内容以及你对指针之类的东西的处理。例如,Crypto++是用封装程序中的内存例程初始化的,并且不会暴露编译时使用的RTL版本中的malloc’ed内存。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 提升序列化 1:73 的向后兼容性问题
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- Visual Studio 19-17 库兼容性根据 GL 标志
- C++ ABI 兼容性问题/张量流
- Oracle OCCI 和 g++ 7.1 的兼容性问题
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- 对指针和恒常性兼容性的引用
- 检查操作系统兼容性
- 添加noexcept是否会破坏二进制兼容性
- 右值需要分配什么向后兼容性
- 如何在不添加对库的依赖的情况下添加与库结构的兼容性
- 在Qt中使用C++Lambda函数作为插槽是否有助于保持库的二进制兼容性?
- python 和 swig 版本兼容性问题
- Tensorflow C++ API 和 Caffe 兼容性问题与 Glog 相关
- 当要求兼容性时,核心OpenGL上下文?
- 启用和禁用 RTTI 的模块之间的兼容性
- 值为 std::string,同时保持向后兼容性
- 将 OpenGL 兼容性配置文件与英特尔 HD GPU + Mesa 结合使用