VS2010和VS2012之间的二进制C++库兼容性

Binary C++ library compatibility between VS2010 and VS2012?

本文关键字:C++ 兼容性 二进制 VS2012 之间 VS2010      更新时间:2023-10-16

我对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内存。