【问题标题】:error LNK: unresolved external symbol, resulting from virtual functions错误 LNK:未解析的外部符号,由虚函数引起
【发布时间】:2012-05-22 01:58:52
【问题描述】:

以下是我编译代码时的错误。很抱歉我不能在这里分享我的代码。仅供参考,我不使用任何外部库,所以我真的不确定这些链接器错误。它们似乎来自我在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(可能的解决方案):

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

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

但在我的例子中,DeviceManagerclass 也有一些非虚函数,也需要实例化才能调用非虚函数。因此,解决方案是在继承DeviceManager类的其他类中声明和定义之外,在DeviceManager类的.cpp中实现虚函数的定义。

【问题讨论】:

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


    【解决方案1】:

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

    你的类是否至少有一个非虚成员函数?
    几年前我就看到过这个问题。

    除此之外,我建议将函数原型和完整参数列表复制到 word pad 或其他东西中并更改字体(以防止它看起来如此熟悉以至于你的眼睛会扫描它),然后比较对每个函数的每个调用以进行确保它们匹配(更可能导致编译问题,但值得检查)。

    【讨论】:

    • 是的,DeviceManager 类有 3 个非虚拟函数。而且是的,我已经清理并重建了它,没有任何改变。
    • 是的,所有这些和代码中的一切似乎都很好,还没有进展!
    • 史蒂夫,我想我现在有一个解决方案,请看看我的更新并评论你的想法。感谢您的帮助:)
    • 听起来不错,干得好——我想这可能是我多年前看到的关于我想到的一个非虚拟成员的问题,抱歉我没有更具体地记得它或者我本可以让你免于挠头!!!
    猜你喜欢
    • 2013-02-22
    • 2018-11-19
    • 2019-02-26
    • 1970-01-01
    • 2013-02-20
    • 2012-09-04
    • 2013-05-02
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多