Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二进制C++;VS2010和VS2012之间的库兼容性?_C++_Visual Studio 2010_Visual Studio_Visual Studio 2012 - Fatal编程技术网

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

C++ 二进制C++;VS2010和VS2012之间的库兼容性?,c++,visual-studio-2010,visual-studio,visual-studio-2012,C++,Visual Studio 2010,Visual Studio,Visual Studio 2012,我对VS2010和VS2012之间编译库的二进制兼容性感到困惑。我想迁移到VS2012,但是许多封闭源代码的纯二进制SDK仅适用于VS2010,例如用于连接硬件设备的SDK 传统上,据我所知,VisualStudio对编译器版本非常挑剔,在VS2010中,您无法链接到为VS2008编译的库 我现在感到困惑的原因是,我正在迁移到VS2012的过程中,我已经尝试了几个项目,而最让我惊讶的是,其中许多项目在跨版本工作时都没有问题 注意:我不是说v100模式,据我所知,它只是VS2010编译引擎上的VS

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

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


我现在感到困惑的原因是,我正在迁移到VS2012的过程中,我已经尝试了几个项目,而最让我惊讶的是,其中许多项目在跨版本工作时都没有问题

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

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

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

另一方面,许多库工作正常,没有错误或附加警告

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


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

“许多库工作正常。这是怎么可能的?”

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

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

3) 不调用任何具有已更改布局或含义的结构的对象,以避免崩溃

#3是一个值得担心的问题。您可以使用导入来查看它使用了什么,并制作一个完整的列表,但是没有文档或保证哪些是兼容的。仅仅因为它似乎在运行并不意味着它没有潜在的bug

也有可能

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


而且(我想不是你的情况)DLL可以被隔离,并且有自己的RTL,不在不同的机制之间来回传递(比如内存分配和释放)。在proc中,COM服务器就是这样工作的。如果您对传递和返回的内容以及指针之类的操作非常小心,DLL通常可以做到这一点。例如,Crypto++是使用封闭程序中的内存例程初始化的,并且不会从编译它时使用的RTL版本中暴露malloc’ed内存。

“其中许多都可以跨版本工作,没有问题。”仅就您所知。更有可能的是,它们恰好在99%的时间里保持一致,并且似乎在工作。传递
std::deque
可能不会显示编译器错误,但可能会崩溃。VS2012环境确实会寻找各种构建工具链,并允许您将它们用作v110(或CTP)的替代品。它不是在某个神奇的交替宇宙中运行的VS2012。它实际上只是使用您告诉它用于构建实现的任何东西。这也是您空闲时使用(或不使用)CTP的方式。stdlib在版本之间没有二进制兼容性。有太多的内联和变化的数据结构。另请参见:是的,兼容性问题与工具链无关,它们与内存布局有关,内存布局中的常见数据类型和假设烘焙到内联函数中。