wxWidgets ошибка линковки
От: Аноним  
Дата: 02.12.09 23:00
Оценка:
Здравствуйте
Пишу следующий код в h-файл (извините, что такой длинный):
#ifndef mainwndincluded
#define mainwndincluded

#include <wx/wx.h>
#define Order 4

enum {
        ID_BTNSOLVE = 1,
        ID_BTNQUIT,
};

class MainWnd: public wxFrame {
public:
    MainWnd(const wxString &title);

    void OnSolve(wxCommandEvent &ev);
    void OnQuit(wxCommandEvent &ev);

    DECLARE_EVENT_TABLE()
};

BEGIN_EVENT_TABLE(MainWnd, wxFrame)
    EVT_BUTTON(ID_BTNSOLVE, MainWnd::OnSolve)
    EVT_BUTTON(ID_BTNQUIT, MainWnd::OnQuit)
END_EVENT_TABLE()

#endif

И получаю ошибки линковки
error LNK2005: "protected: static struct wxEventTable const MainWnd::sm_eventTable" (?sm_eventTable@MainWnd@@1UwxEventTable@@B) already defined in main.obj
1>MainWnd.obj : error LNK2005: "protected: static class wxEventHashTable MainWnd::sm_eventHashTable" (?sm_eventHashTable@MainWnd@@1VwxEventHashTable@@A) already defined in main.obj
1>MainWnd.obj : error LNK2005: "private: static struct wxEventTableEntry const * const MainWnd::sm_eventTableEntries" (?sm_eventTableEntries@MainWnd@@0QBUwxEventTableEntry@@B) already defined in main.obj
1>MainWnd.obj : error LNK2005: "protected: virtual class wxEventHashTable & __thiscall MainWnd::GetEventHashTable(void)const " (?GetEventHashTable@MainWnd@@MBEAAVwxEventHashTable@@XZ) already defined in main.obj
1>MainWnd.obj : error LNK2005: "protected: virtual struct wxEventTable const * __thiscall MainWnd::GetEventTable(void)const " (?GetEventTable@MainWnd@@MBEPBUwxEventTable@@XZ) already defined in main.obj
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:\Documents\Visual Studio 2008\Projects\E\Release\1SL.exe : fatal error LNK1169: one or more multiply defined symbols found


Я же определил #ifndef ... #endif, значит этот h-файл должен включаться только один раз (он включен в main.cpp и mainwnd.cpp, где описана реализация методов). Тогда почему мне говорят о нескольких определениях одного и того же символа?
Спасибо
Re: wxWidgets ошибка линковки
От: Аноним  
Дата: 02.12.09 23:06
Оценка:
А вот если перенести эту секцию
BEGIN_EVENT_TABLE(MainWnd, wxFrame)
    EVT_BUTTON(ID_BTNSOLVE, MainWnd::OnSolve)
    EVT_BUTTON(ID_BTNQUIT, MainWnd::OnQuit)
END_EVENT_TABLE()

в срр-файл, все работает. Ничего не понимаю. Да какая ему разница, если inc-файл включается только один раз?
Re: wxWidgets ошибка линковки
От: Константин Б. Россия  
Дата: 03.12.09 01:57
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Я же определил #ifndef ... #endif, значит этот h-файл должен включаться только один раз (он включен в main.cpp и mainwnd.cpp, где описана реализация методов). Тогда почему мне говорят о нескольких определениях одного и того же символа?


#ifndef/#endif защищает от повторного включения в один cpp-файл. Таким образов h-файл включается по одному разу в main.cpp и в mainwnd.cpp и линкер совершенно справедливо ругается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.