VC 6.0 和 VC 8.0 的名称改编问题
本文介绍了 VC++ 6.0 和 VC 8.0 中名称改编的变化可能导致现有应用程序出现问题,以及如何解决这些问题。
引言
我们都知道,名称改编或装饰是编译器特定的。而新的 VC 8.0 也不例外。它采用了一种新的名称改编方案,这在我们的一个最近的项目中造成了问题。问题的原因在于这些编译器名称改编方案的差异。好吧,我不会深入探讨 VC 8.0 的名称改编方案。但是,如果有一种情况是,您需要在 VC 6.0 项目中使用使用 VC 8.0 构建的 MFC 扩展 DLL 怎么办?
问题描述
我们有一个使用 VC 8.0 构建的 MFC 扩展 DLL(一个可以导出类的 DLL),并且我们想在 VC 6.0 项目中使用该 DLL。现在,如果我想在我的 VC 6.0 项目中使用该扩展 DLL,我所需要做的就是添加包含类及其成员声明的**头文件**和在链接时使用的**lib 文件**。
我们期望一切顺利,但是当您构建 VC 6.0 应用程序时,您会收到一个错误,提示无法链接到我们从 VC 6.0 应用程序调用的类成员函数。问题在于 VC 6.0 将创建头文件中指定的类成员函数的改编版本,并尝试将其与 lib 文件中的版本匹配。不幸的是,lib 文件中的装饰版本与 VC 6.0 生成的版本不匹配。
我们如何解决这个问题?在题为“**导出模板实例的旧式名称改编**”的 MSDN 文章中,微软建议在链接器命令行选项中包含两种名称改编方案。为了做到这一点,我们必须通过转储导出或在记事本中打开它来识别 lib 文件中的类成员函数的改编版本,以及 VC 6.0 生成的改编版本(您会在构建 VC 6.0 应用程序时获得链接器错误 ;-))。将这些版本与 VC 8.0 生成的成员函数的改编版本一起包含,该版本是您尝试调用的版本。
例如
/export: <VC 6.0 decorated version>=<VC 8.0 decorated version>
保存并构建应用程序。现在,您的 lib 文件将为同一个类成员函数生成两个装饰版本,一个基于 VC 6.0 的名称改编方案(我们从链接器错误中获得),另一个基于 VC 8.0 的名称改编方案(我们通过检查 lib 文件识别)。现在使用此 lib 文件并构建 VC 6.0 应用程序。您应该能够成功链接该应用程序。