【问题标题】:How to get rid of linking error in mfc?如何摆脱 mfc 中的链接错误?
【发布时间】:2015-06-06 13:24:38
【问题描述】:

链接过程中出现LNK2001错误:

  • LNK2001: 未解析的外部符号“public: virtual struct CRuntimeClass * __thiscall CChildView::GetRuntimeClass(void)const” (?GetRuntimeClass@CChildView@@UBEPAUCRuntimeClass@@XZ)

为什么会这样?

这是标题中的相关代码:

class CChildView :public CDialog
{

    DECLARE_DYNAMIC(CChildView)

public:

    CChildView();
    ~CChildView();
    afx_msg void OnPaint();
    afx_msg void OnLevelProf();
    afx_msg void OnLevelAmat();
    afx_msg void OnLevelBeg();
    afx_msg void OnStepC();
    void new_game();
    //void CloseWindow();
    BOOL PreCreateWindow(CREATESTRUCT& cs);
    int end_analyze();
    void ii();
    unsigned long calculate(int id, int x, int y);
    afx_msg void OnNewGame();
    //void Invalidate();
    afx_msg void OnX1010();
    afx_msg void OnX1919();
    afx_msg void OnX3030();
    afx_msg void OnX5050();
    afx_msg void OnX100100();
    //MessageBoxW();
    void resize_window();
    afx_msg void OnLButtonDown(UINT, CPoint xy);
    //void GetWindowRect(RECT);
    //int MessageBoxW();
     void OnStepH();
    void set_chеcked_menu(unsigned int old_id, unsigned int new_id);
    DECLARE_MESSAGE_MAP()
};

还有.cpp文件的部分:

//IMPLEMENT_DYNAMIC(CChildView, CWnd)//!without this - doesn`t compiles. With - //runtime failure
BEGIN_MESSAGE_MAP(CChildView, CWnd)
    ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    .....
    END_MESSAGE_MAP()

但是在我的程序执行期间(如果未注释 implement_dynamicaly)它在 AfxWinMain 函数中失败就行了:

if (!pThread->InitInstance())

我的其他类没有明确定义它们并且它们没有错误。 这是这样的想法,但它对我没有帮助。 MFC dlg class link errors for MyClass::GetMessageMap() and MyClass::GetRuntimeClass (MSVC 2008)

【问题讨论】:

  • 由于您使用的是DECLARE_DYNAMIC,因此您需要IMPLEMENT_DYNAMIC。您的问题与链接无关。它与程序的运行时行为有关,您几乎没有提供任何相关信息。启动你的调试器。找出发生了什么。
  • 你从CDialog开车。但随后你在IMPLEMENT_DYNAMICBEGIN_MESSAGE_MAP 中切换到CWnd。从您的声明来看,我不知道这是否意味着CDialogCWndCView。暂时注释掉DECLARE_DYNAMIC。此外,您应该大致解释一下您所追求的视图模型类型(对话框或多文档视图或单文档......)

标签: c++ visual-c++ visual-studio-2013 mfc linker


【解决方案1】:

您注释掉了 IMPLEMENT_DYNAMIC(CChildView, CWnd) 行。

您需要在您的 CChildView 类中注释掉 DECLARE_DYNAMIC() 宏,或者取消注释掉 IMPLEMENT_DYNAMIC——它们与您的类的 CRuntimeClass 有关。此外,如果您取消注释 IMPLEMENT_DYNAMIC,您应该确保宏中的基类与您派生的类匹配。 IOW,它应该说 CDialog 而不是 CWnd。此外,您的 BEGIN_MESSAGE_MAP() 也遇到了同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多