当Microsoft最初于2012年9月发布Visual Studio 2012时,他们宣布了他们计划更频繁地为Visual Studio提供更新的计划.从那时起,他们于2012年11月发布了Visual Studio 2012 Update 1(Visual Studio 2012.1),并于2013年4 月发布了Visual Studio 2012 Update 2(Visual Studio 2012.2).
我的问题是:更新是否引入了对C++ ABI的任何更改(关于最初的VS2012版本)?链接.lib不同的VS2012版本是否安全?
我在互联网上搜索了一段时间,但未找到微软的任何明确声明.有些消息来源提到C++代码生成中的一些错误已得到修复,但我认为这并不意味着ABI的变化?
我有两个场景.假设我有3个导出C++符号的共享库,每个库都使用VS7.1,VS8和VS9构建.我在VS9中编译了所有3个.出于某种原因,这是有效的.我不需要在VS9中为VS9链接器重新编译前两个库,以成功找到符号并链接它们.
现在,如果我有一个只使用C语法(extern"C")导出符号的库,这是一样的吗?我听说有人说ABI for C是标准化的,所以在某种程度上保证你可以在所有版本的Visual Studio中使用Visual Studio 8中编译的C库.
基本上,所有这些事情的结合令人困惑.我不确定在不同版本的Visual Studio之间链接C++和基于C的共享库(使用相应的导入库)之间有什么保证.我想听听关于任何其他版本的Visual Studio上C 和 C++导入或静态库的向前/向后兼容性的一致意见.
这对我来说是因为我使用的闭源库是在Visual Studio .NET 2003(VS7.1)中编译的.我的团队认为这将我们锁定到VS 7.1编译器,但是我已经在VS8和VS9中测试了这些库,甚至是VS2010,它们链接得很好.但是,我不确定这个内在的危险.请注意,所讨论的库具有C变体和C++变体.基本上,C变量是标准C导出,C++库是C库和导出类的抽象.
例如,winsock libs在所有版本的visual studio中都能很好地工作.但是我在为所有版本提供一致的二进制文件时遇到了麻烦.使用VS 2005编译的dll在链接到2008年编写的应用程序时将无法工作.我将2k5和2k8升级到SP1,但结果没有太大变化.它的工作原理还可以.但是当它们将它包含在C#应用程序中时,C#应用程序会出现访问冲突错误,但使用经典的C++应用程序时,它可以正常工作.
当我提供dll时,我应该知道一个策略吗?
这个问题与"如何跨VS版本制作一致的dll二进制文件"有关.
虽然静态函数可以用类似的东西来处理
// Header file
class DLL_API Foo
{
int init();
}
extern "C"
{
int DLL_API Foo_init();
}
// Implementation file
int Foo_init()
{
return Foo::init();
}
Run Code Online (Sandbox Code Playgroud)
使用非静态方法并不容易.
据我了解,Chris Becke建议使用类似COM的接口对我没有帮助,因为接口成员名称仍然会被装饰,因此无法从使用不同编译器创建的二进制文件中访问.我在那儿吗?
唯一的解决方案是使用处理程序写一个C风格的DLL接口到对象还是我错过了什么?在这种情况下,我想,我可能会更少的努力直接使用包装的C库.