Ik ben een applicatie aan het maken die gebruik maakt van het singleton pattern. En ik gebruik wxWidgets als framework. Echter krijg ik op de static instantie van mijn object een link error, eveneens op de static mutex die de eventuele creatie van de instantie afschermt.
De headerfile:
De cpp file:
De link errors:
debugWindow.obj : error LNK2001: unresolved external symbol "private: static class wxMutex debugWindow::s_lock_instance" (?s_lock_instance@debugWindow@@0VwxMutex@@A)
debugWindow.obj : error LNK2001: unresolved external symbol "private: static class debugWindow * debugWindow::s_instance" (?s_instance@debugWindow@@0PAV1@A)
vc_mswd\msnclient.exe : fatal error LNK1120: 2 unresolved externals
Ik tast eigenlijk helemaal in't duister of't nu een wxWidgets of een C++-programmeer fout is of een bug in de linker (denk ik niet)? WxWidgets probleem lijkt me ook niet, want in die richting heb ik al gezocht. Als het een C++ programmeer fout is, de welke? Samengevat, ik zie zelfs niet waar het probleem eventueel zou kunnen liggen, laat staan waar ik kan zoeken.
Waar ik al gezocht heb: Google op de link error, maar daar was het probleem meestal een niet goed geinclude library. Maar ik ben er zeker van dat threads van wx zijn geinclude. (de methodes fromServer, toServer en generalDebug maakten al gebruik van die mutexes voor ik singleton pattern ging include, en die werkten perfect.)
Iemand nog verhelderende ideeën?
De headerfile:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| #pragma once #include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif class debugWindow : public wxFrame { public: void fromServer(const wxString s); void toServer(const wxString s); void generalDebug(const wxString s); static debugWindow* Instance(void); private: wxTextCtrl *_output; wxMutex s_mutex_output; static wxMutex s_lock_instance; static debugWindow* s_instance; debugWindow(); debugWindow(const debugWindow&); debugWindow& operator=(const debugWindow&); }; |
De cpp file:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| #include "debugWindow.h" #include "msn_global_config.h" debugWindow::debugWindow(): wxFrame(NULL, -1, "Debug", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "Debug frame") { wxPanel *topPanel = new wxPanel(this); wxStaticBox *debugBox = new wxStaticBox(topPanel,-1,"Debug"); wxStaticBoxSizer *debugSizer = new wxStaticBoxSizer(debugBox, wxHORIZONTAL); _output = new wxTextCtrl(topPanel,-1,"",wxDefaultPosition, wxSize(400,600),wxTE_MULTILINE|wxTE_RICH,wxDefaultValidator, "Debug"); debugSizer->Add(_output,wxSizerFlags(1).Expand().Border(wxALL,5)); topPanel->SetSizer(debugSizer); debugSizer->SetSizeHints(this); } void debugWindow::fromServer(const wxString s) { s_mutex_output.Lock(); _output->SetDefaultStyle(wxTextAttr(*wxGREEN)); *_output << "S->C: " << s << "\n"; s_mutex_output.Unlock(); } void debugWindow::toServer(const wxString s) { s_mutex_output.Lock(); _output->SetDefaultStyle(wxTextAttr(*wxRED)); *_output << "C->S: " << s << "\n"; s_mutex_output.Unlock(); } void debugWindow::generalDebug(const wxString s) { s_mutex_output.Lock(); _output->SetDefaultStyle(wxTextAttr(*wxBLACK)); *_output << "Gen: " << s << "\n"; s_mutex_output.Unlock(); } debugWindow* debugWindow::Instance() { if (s_instance == NULL){ wxMutexLocker lock(s_lock_instance); if (s_instance == NULL){ s_instance = new debugWindow(); } } return s_instance; } debugWindow::debugWindow(const debugWindow&) { } debugWindow& debugWindow::operator=(const debugWindow&) { return *s_instance; } |
De link errors:
debugWindow.obj : error LNK2001: unresolved external symbol "private: static class wxMutex debugWindow::s_lock_instance" (?s_lock_instance@debugWindow@@0VwxMutex@@A)
debugWindow.obj : error LNK2001: unresolved external symbol "private: static class debugWindow * debugWindow::s_instance" (?s_instance@debugWindow@@0PAV1@A)
vc_mswd\msnclient.exe : fatal error LNK1120: 2 unresolved externals
Ik tast eigenlijk helemaal in't duister of't nu een wxWidgets of een C++-programmeer fout is of een bug in de linker (denk ik niet)? WxWidgets probleem lijkt me ook niet, want in die richting heb ik al gezocht. Als het een C++ programmeer fout is, de welke? Samengevat, ik zie zelfs niet waar het probleem eventueel zou kunnen liggen, laat staan waar ik kan zoeken.
Waar ik al gezocht heb: Google op de link error, maar daar was het probleem meestal een niet goed geinclude library. Maar ik ben er zeker van dat threads van wx zijn geinclude. (de methodes fromServer, toServer en generalDebug maakten al gebruik van die mutexes voor ik singleton pattern ging include, en die werkten perfect.)
Iemand nog verhelderende ideeën?