返回

MSVC 2017 中 std::exception 未解决异常疑难解答

windows

MSVC 2017 中 std::exception 未解决异常的故障排除

在将遗留的 VC++ 项目迁移到 MSVC 2017 时,你可能会遇到一个神秘的编译错误:

unresolved external symbol "__declspec(dllimport) public: __thiscall std::exception::exception(char const * const &,int)" (__imp_??0exception@std@@QAE@ABQBDH@Z) referenced in function "public: __thiscall std::bad_alloc::bad_alloc(void)" (??0bad_alloc@std@@QAE@XZ)

这个错误表明编译器无法找到 std::exception 类的构造函数。这可能是由于缺少了必需的标准库而造成的。

解决方法

为了解决此问题,我们需要确保项目链接了正确的标准库。具体来说,我们需要将以下库添加到项目的链接器设置中:

msvcrt.lib

通过添加此库,编译器将可以访问包含 std::exception 类的标准 C++ 运行时库。

其他注意事项

在排除此错误时,还有其他几个事项需要考虑:

  • legacy MFC 库的排除

你已经从链接器设置中排除了 legacy MFC 库(mfc80d.lib 和 mfcs80d.lib)。这是正确的,因为这些库不适用于 MSVC 2017。

  • 其他潜在原因

如果链接 msvcrt.lib 无法解决问题,则可能有其他因素导致此错误。以下是一些需要检查的可能原因:

* 确保使用正确的头文件和命名空间。
* 检查代码中是否存在语法错误或拼写错误。
* 尝试重建项目。
* 将 MSVC 更新到最新版本。

常见问题解答

1. 为什么在将项目迁移到 MSVC 2017 时会遇到此错误?

在较新的 Visual Studio 版本中,默认情况下已停用 msvcrt.lib 库的链接。因此,在迁移较旧的项目时,需要显式地添加此库。

2. 为什么将 legacy MFC 库排除在外很重要?

legacy MFC 库不适用于 MSVC 2017,并且会与更新的标准库发生冲突。

3. 如果链接 msvcrt.lib 无法解决问题,我应该怎么办?

请检查其他潜在原因,例如语法错误、不匹配的头文件或过时的编译器。

4. 除了未解决的 std::exception 异常之外,此错误还会导致其他问题吗?

它还可能导致链接器警告,指出本地定义的 std::exception 类的成员函数被导入。

5. 此错误对我的项目有什么影响?

如果没有 std::exception 类,你的项目将无法处理异常,这可能导致意外终止。

结论

通过将 msvcrt.lib 库添加到链接器设置并排除 legacy MFC 库,你可以解决未解决的 std::exception 异常并确保你的项目在 MSVC 2017 中成功编译。记住,如果遇到任何问题,请不要犹豫,进一步排除故障并寻求帮助。