静态库是否避免了名称错位问题?

时间:2011-06-14 10:25:58

标签: c++ visual-studio-2008 static-libraries porting vc6

我有一个用Visual Studio 2003 SP1编写的C ++ \ MFC应用程序链接到外部静态库“SomeExtStaticLib.lib”。我还包括“SomeExtStaticLib.lib”提供的头文件,以在我的应用程序中创建对象。

SomeExtStaticLib.lib是使用VC6构建的静态库。

现在,我正在将我的应用程序迁移到Visual Studio 2008.

我有一个非常基本的问题。

我是否还要将“SomeExtStaticLib.lib”迁移到VS2008编译的一个? 当我尝试在VC9编译的应用程序中使用此VC6编译的“SomeExtStaticLib.lib”时,它没有给出任何链接器错误。我期待至少一些名称破坏问题。

静态库是否会消除名称错位问题?

3 个答案:

答案 0 :(得分:2)

问题不是静态与动态链接,也不是名称 截断。问题是所用内容的二进制兼容性之一 在界面中。因此,例如,除非我严重错误,否则 VC6和VC9之间std::string的定义发生了变化 不同的布局。因此,如果任何代码使用std::string,您将拥有 重新编译,或在运行时出现奇怪且无法解释的错误。

一般情况下,最好不要假设没有二进制兼容性 不同版本的编译器,甚至不同的编译 除非供应商另有保证,否则涉及选项。 (虽然 一些常识是有序的:你可以自由地混合选项 例如,控制警告。但要注意导致添加的/D 调试要生成的代码。)

答案 1 :(得分:1)

如果应用程序未更改,则需要库中的相同符号集。因此,您可以链接到使用VC6.0编​​译的库。除非应用程序和库与VC6.0中的兼容(工作)相同,否则名称修改根本不是问题。

我是否还要将SomeExtStaticLib.lib迁移到VS2008编译的?
VC6.0和visual 2008之间存在兼容性问题。所以 YES 您应该使用Visual 2008重建yor库。

仅仅因为你可以链接到库并不意味着它可以正常工作。

静态库是否会消除名称错位问题?
并不是的。他们根本没有做任何特别的事情。

答案 2 :(得分:0)

静态库与名称修改没有任何关系....如果你的代码是C ++,那么就会出现错误,如果它的C(或C ++中的外部“C”)那么就没有错误。只要库和链接它的代码一致,就可以在库中链接没有问题。