我有两个场景。假设我有3个导出C ++符号的共享库,每个库都使用VS7.1,VS8和VS9构建。我在VS9中编译了所有3个。出于某种原因,这是有效的。我不需要在VS9 for VS9链接器中重新编译前两个库来成功找到符号并链接它们。
现在,如果我有一个只使用C语法(extern“C”)导出符号的库,这是一样的吗?我听说有人说ABI for C是标准化的,因此可以保证你可以在所有版本的Visual Studio中使用Visual Studio 8中编译的C库。
基本上,所有这些事情的结合令人困惑。我不确定在不同版本的Visual Studio之间链接C ++和基于C的共享库(使用相应的导入库)之间有什么保证。我想听听关于任何其他版本的Visual Studio上C AND C ++导入或静态库的向前/向后兼容性的一致意见。
这对我来说是因为我使用的闭源库是在Visual Studio .NET 2003(VS7.1)中编译的。我的团队认为这将我们锁定到VS 7.1编译器,但是我已经在VS8和VS9中测试了这些库,甚至VS2010,它们链接得很好。但是,我不确定这个内在的危险。请注意,所讨论的库具有C变体和C ++变体。基本上,C变量是标准C导出,C ++库是C库和导出类的抽象。
答案 0 :(得分:4)
问题可能不仅存在于这些VS版本之间的ABI差异(调用约定等),还存在于系统DLL库中的删除/更改符号中。有关VS8(2005,Windows SDK 5.0)和VS9(2008,Windows SDK 6.0)之间的系统DLL库的详细比较,请参阅this table。
有关Windows SDK的信息,请参阅compatibility matrix。
答案 1 :(得分:2)
extern "C"
导出的符号与C ++符号不同。 C ++有名称修改(参见http://en.wikipedia.org/wiki/Name_mangling)。
C ++符号的修改可能因编译器版本而异,因此在VS7 / 8/9设置中,相同的C ++方法名称可能会被修改为不同的名称。
基本上,您的团队似乎是对的 - 您将被锁定在用于编译库的编译器的相同主要版本中。