13

我有两种情况。假设我有 3 个导出 C++ 符号的共享库,每个库都是用 VS7.1、VS8 和 VS9 构建的。我在 VS9 中编译了所有 3 个。出于某种原因,这行得通。我不需要为 VS9 链接器重新编译 VS9 中的前 2 个库来成功找到符号并链接它们。

现在,如果我有一个只使用 C 语法(extern "C")导出符号的库,这是否相同?我听说有人说 C 的 ABI 是标准化的,因此可以保证您可以在所有版本的 Visual Studio 中使用在 Visual Studio 8 中编译的 C 库。

基本上,所有这些东西的组合是令人困惑的。我不确定在不同版本的 Visual Studio 之间链接 C++ 和基于 C 的共享库(使用它们相应的导入库)之间有什么保证。我想听到关于 CC++ 导入或静态库在任何其他版本的 Visual Studio 上的向前/向后兼容性的普遍共识。

我之所以出现这种情况,是因为我使用的一些闭源库是在 Visual Studio .NET 2003 (VS7.1) 中编译的。我的团队认为这将我们锁定在 VS 7.1 编译器上,但是我已经在 VS8 和 VS9,甚至 VS2010 中测试了这些库,并且它们链接得很好。但是,我不确定这其中的内在危险。请注意,有问题的库有一个 C 变体和一个 C++ 变体。基本上,C 变体是标准 C 导出,而 C++ 库是 C 库和导出类的抽象。

4

2 回答 2

4

问题可能不仅在于这些 VS 版本之间的 ABI 差异(调用约定等),还在于系统 DLL 库中删除/更改的符号。有关VS8(2005,Windows SDK 5.0)和 VS9(2008,Windows SDK 6.0)之间系统 DLL 库的详细比较,请参见此表。

另请参阅Windows SDK 的兼容性矩阵

在此处输入图像描述

于 2012-02-13T07:14:42.847 回答
2

extern "C"导出的符号不同于 C++ 符号。C++ 具有名称修饰(参见http://en.wikipedia.org/wiki/Name_mangling)。

C++ 符号的修饰可能因编译器版本而异,因此在您的 VS7/8/9 设置中,相同的 C++ 方法名称可能会被修饰为不同的名称。

基本上,您的团队似乎是对的——您将被锁定在用于编译库的同一主要版本的编译器中。

于 2012-02-10T18:56:26.710 回答