静态库是否可以避免名称篡改问题

Does static library avoids name mangling issues?

本文关键字:问题 是否 可以避免 静态      更新时间:2023-10-16

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

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

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

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

我还应该将"SomeExtStaticLib.lib"迁移到VS2008编译的版本吗?当我试图在我的VC9编译的应用程序中使用这个VC6编译的"SomeExtStaticLib.lib"时,它没有出现任何链接器错误。我本以为至少会有一些名字混乱的问题。

静态库是否消除了名称篡改问题?

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

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

如果应用程序保持不变,则需要库中的相同符号集。因此,也许您可以链接到使用VC6.0编译的库。除非应用程序和库与VC6.0中的兼容(工作)程序和库相同,否则根本不需要考虑名称篡改。

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

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

静态库是否消除了名称篡改问题
不是。他们根本没有做什么特别的事。

静态库与名称篡改无关。。。。如果您的代码是C++,则存在损坏,如果它是C(或C++中的外部"C"),则不存在损坏。只要库和链接它的代码一致,在库中链接就没有问题。