错误LNK:由虚函数产生的未解析的外部符号

时间:2012-05-14 14:55:09

标签: visual-c++ virtual unresolved-external

以下是编译代码时的错误。对不起,我不能在这里分享我的代码。仅供参考,我不使用任何外部库,所以我真的不确定这些链接器错误。它们似乎来自我在DeviceManager类中声明的虚函数。他们各自的实现在另外两个类中。

有人可以帮我解决这些错误吗?

1>device_manager.obj : error LNK2028: unresolved token (0A000397) "public: virtual void __clrcall DeviceManager::loadConfig(class System::IO::StreamReader ^)" (?DeviceManager@DeviceManager@@$$FUAMXP$AAVStreamReader@IO@System@@@Z) referenced in function "void __clrcall `dynamic initializer for 'const DeviceManager::`vftable'''(void)" (???__E??_7DeviceManager@@6B@@@YMXXZ@?A0xc2524ebc@@$$FYMXXZ)
1>device_manager.obj : error LNK2019: unresolved external symbol "public: virtual void __clrcall DeviceManager::loadConfig(class System::IO::StreamReader ^)" (?loadConfig@DeviceManager@@$$FUAMXP$AAVStreamReader@IO@System@@@Z) referenced in function "void __clrcall `dynamic initializer for 'const DeviceManager::`vftable'''(void)" (???__E??_7DeviceManager@@6B@@@YMXXZ@?A0xc2524ebc@@$$FYMXXZ)
1>device_manager.obj : error LNK2001: unresolved external symbol "public: virtual class Device * __thiscall DeviceManager::createDevice(void)" (?createDevice@DeviceManager@@UAEPAVDevice@@XZ)
1>device_manager.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall DeviceManager::initializeDevices(void)" (?initializeDevices@DeviceManager@@UAEXXZ)
1>C:\Users\CH\Documents\Visual Studio 2010\Projects\Test Devices\Test Devices\Debug\Test Devices.exe : fatal error LNK1120: 4 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.50
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  

更新1(可能的解决方案):

问题似乎是因为在DeviceManager类中声明的虚拟函数不是纯虚拟的,并且在.cpp类的DeviceManager中没有定义。

如果DeviceManager类没有任何非虚函数,那么将虚拟函数设为纯将是解决方案。像virtual void testFunction();这样的东西并不纯粹,所以将它改为virtual void testFunction()=0;就是解决方案。为此,在继承DeviceManager类的其他classe中实现此虚函数的定义就足够了。在这种情况下,DeviceManager类变为抽象,因此无法实例化。

但在我的情况下,DeviceManager类也有一些非虚函数,还需要实例化以调用非虚函数。因此,解决方案是在.cpp类的DeviceManager中实现虚函数的定义,而不是继承DeviceManager类的其他类中的声明和定义。

1 个答案:

答案 0 :(得分:0)

您是否尝试过彻底清理并重建?

您的班级是否至少有一个非虚拟成员函数?
几年前我已经看过这个问题了。

除此之外,我建议将函数原型和完整参数列表复制到字垫或其他内容并更改字体(以使其看起来如此熟悉以至于您的眼睛扫过它)然后将每个调用与每个函数进行比较确保它们匹配(更可能导致complile问题,但值得检查)。