繁体   English   中英

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是值得担心的人。 您可以使用导入来查看它使用的内容并制作完整的列表,但是没有文档或保证哪些是兼容的。 仅仅因为它似乎运行并不意味着它没有潜在的错误。

还有可能

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM