4

我对 VS2010 和 VS2012 之间编译库的二进制兼容性感到困惑。我想迁移到 VS2012,但是许多封闭源代码的纯二进制 SDK 仅适用于 VS2010,例如用于连接硬件设备的 SDK。

传统上,据我所知,Visual Studio 对编译器版本非常挑剔,在 VS2010 中,您无法链接到为 VS2008 编译的库。

我现在感到困惑的原因是,我正在迁移到 VS2012 的过程中,并且我尝试了一些项目,最令我惊讶的是,其中许多都可以毫无问题地跨版本工作。

注意:我不是在谈论 v100 模式,据我所知,它只是 VS2010 编译引擎上的 VS2012 GUI。

我说的是在VS2012中打开一个VS2010的解决方案,点击更新,看看会发生什么。

当链接到一些更大的库时,比如 boost,编译不起作用,因为有编译器版本检查,它们会引发错误并中止编译。其他一些库只是在缺少功能时中止。这是我所期望的行为。

另一方面,许多库工作正常,没有错误或额外的警告。

这怎么可能?VS2012 是否以特殊方式制作以保持与 VS2010 库的二进制兼容性?它是否取决于动态与静态链接?

还有最重要的问题:即使在编译时没有出现错误,我是否可以相信编译器在将 VS2012 项目链接到 VS2010 编译库时不会出现任何错误?

4

1 回答 1

3

“许多图书馆运作良好。怎么可能?”</p>

1) lib 被编译为使用静态 RTL,因此代码不会引入第二个冲突的 RTL DLL。

2)代码只调用完全在头文件中的函数(并使用结构等),因此不会导致链接器错误,或者调用仍然存在于新 RTL 中的函数,因此不会导致链接器错误,

3) 不会调用任何具有更改布局或含义的结构的东西,因此它不会崩溃。

#3是需要担心的。您可以使用导入来查看它使用的内容并制作完整列表,但没有文档或保证哪些是兼容的。仅仅因为它似乎在运行并不意味着它没有潜在的错误。

也有可能

4) 编写了相当低级别的驱动程序 SDK 或其他代码,以避免完全使用标准库调用。

另外(我认为不是你的情况)DLL 可以被隔离并拥有自己的 RTL,并且不会在不同的制度之间来回传递东西(如内存分配和释放)。进程内 COM 服务器以这种方式工作。如果您对传递和返回的内容以及对指针之类的内容进行处理,DLL通常可以做到这一点。例如,Crypto++ 使用封闭程序中的内存例程进行初始化,并且不会从编译它的 RTL 版本中公开 malloc 的内存。

于 2014-09-15T22:29:54.953 回答