如何消除mfc中的链接错误?

时间:2015-06-06 13:24:38

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

在链接过程中发生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()

但是在我的程序执行期间(如果implements_dynamicaly被取消注释),它在该行的AfxWinMain函数中失败:

if (!pThread->InitInstance())

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

1 个答案:

答案 0 :(得分:1)

你注释掉了IMPLEMENT_DYNAMIC(CChildView,CWnd)这一行。

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