2015-06-06 2 views
0

В proccess увязывания ошибка LNK2001 происходит:Как избавиться от ошибки связывания в mfc?

  • LNK2001: неразрешенный внешний символ "общественности: виртуальная структура CRuntimeClass * __thiscall CChildView :: GetRuntimeClass (аннулируются) 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)

+2

Поскольку вы используете 'DECLARE_DYNAMIC', вам нужен' IMPLEMENT_DYNAMIC'. Ваш вопрос не о связи. Это касается поведения вашей программы во время выполнения, и вы не предоставили информацию об этом. Запустите свой отладчик. Узнайте, что происходит. –

+0

Вы едете из 'CDialog'. Но затем вы переключаетесь на 'CWnd' в' IMPLEMENT_DYNAMIC' и в 'BEGIN_MESSAGE_MAP'. Из взгляда ваших заявлений я не знаю, должно ли это быть «CDialog» или «CWnd» или «CView». На данный момент комментируем 'DECLARE_DYNAMIC'. Также вы должны объяснить примерно, какую модель просмотра вы используете (диалог или просмотр нескольких документов или один документ ...) –

ответ

1

Вы закомментировали строку IMPLEMENT_DYNAMIC (CChildView, CWnd).

Вам нужно либо прокомментировать макрос DECLARE_DYNAMIC() в вашем классе CChildView, либо раскомментировать IMPLEMENT_DYNAMIC - они связаны с CRuntimeClass для вашего класса. Кроме того, если вы раскомментируете IMPLEMENT_DYNAMIC, вы должны убедиться, что базовый класс в макросе соответствует классу, из которого вы извлекаете. IOW, он должен сказать CDialog, а не CWnd. Кроме того, у вашей BEGIN_MESSAGE_MAP() есть одна и та же проблема.

Смежные вопросы