WxWidgets Installiren
-
Hi!,
Hab mir auch letztens wxWidgets installiert, und zwar richtig (hoffe ich),
bekomme leider auch Fehlermeldungen (allerdings nicht die selben).D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h||In constructor 'wxCharBuffer::wxCharBuffer(const char*)':|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h|127|error: 'strdup' was not declared in this scope|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h||In member function 'wxCharBuffer& wxCharBuffer::operator=(const char*)':|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h|127|error: 'strdup' was not declared in this scope|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h||In constructor 'wxWCharBuffer::wxWCharBuffer(const wchar_t*)':|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h|134|error: '_wcsdup' was not declared in this scope|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h||In member function 'wxWCharBuffer& wxWCharBuffer::operator=(const wchar_t*)':|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\buffer.h|134|error: '_wcsdup' was not declared in this scope|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\string.h||In function 'int Stricmp(const char*, const char*)':|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\string.h|141|error: 'strcasecmp' was not declared in this scope|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\list.h||In constructor 'wxListKey::wxListKey(const wxChar*)':|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\list.h|406|error: 'strdup' was not declared in this scope|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\list.h||In constructor 'wxListKey::wxListKey(const wxString&)':|
D:\wxWidgets-2.8.12\wxWidgets-2.8.12\include\wx\list.h|408|error: 'strdup' was not declared in this scope|Der Quellcode ist derselbe wie im Anfangspost von pawl, da dacht' ich es passt hier rein ...
Mein Compiler ist GCC(g++), benutze MinGW mit
CodeBlocks.Gesucht hab' ich im Netz schon länger, finde auch schon Foren wo's diskutiert wurde,
die Lösungen passen aber nicht
(Es gibt sogar unter http://www.c-plusplus.net/forum/214573 ungefähr denselben Post, aber keine
Antwort).Wenn mir jemand helfen könnt' würd' ich mich freuen
VD im Voraus
-
@Hacker: Ich glaube, das Problem kenne ich. Ich habe gerade in meinem Gedächtnis rumgekramt und herausgefunden, dass du -std=c++0x aktiviert hast und wxWidgets eigentlich nicht dafür ausgelegt ist. Jedenfalls wird dadurch ein Makro nicht mehr definiert (oder wird es plötzlich definiert?) und dadurch bekommt wxWidgets Probleme. Ich habe das damals durch ein kleines Eingreifen in die
#ifdef
s im Header umgestellt (der betreffende Code ist sowieso nur ein Versuch einer minimalen Optimierung je nach Compiler).
-
Welchen Header ...?
c++(0x) Flag macht keinen Unterschied...
Bald geb' ichs auf
-
Poste mal den Code aus den wxWidgets-Headern an den Stellen aus der Fehlermeldung (grob).
-
Nimm mal 2.9.2.
Vielleicht geht das besser.
Hat ne Menge Bugfixes gegenüber der 2.8er Reihe. Die ist bald 5 Jahre alt.
-
Erste Zwei Errors:
D:\wxWidgets2.8\include\wx\buffer.h|127|error: 'strdup' was not declared in this scope|
D:\wxWidgets2.8\include\wx\buffer.h|127|error: 'strdup' was not declared in this scope|DEFINE_BUFFER(wxCharBuffer, char, wxStrdupA);//Hier
Nächsten 2 (7 Zeilen weiter unten):
D:\wxWidgets2.8\include\wx\buffer.h|134|error: '_wcsdup' was not declared in this scope|
D:\wxWidgets2.8\include\wx\buffer.h|134|error: '_wcsdup' was not declared in this scope|DEFINE_BUFFER(wxWCharBuffer, wchar_t, wxStrdupW);//Hier
Fünfter:
D:\wxWidgets2.8\include\wx\string.h|141|error: 'strcasecmp' was not declared in this scope|return strcasecmp(psz1, psz2);//Dürfte Klar sein
Letzten zwei:
D:\wxWidgets2.8\include\wx\list.h|406|error: 'strdup' was not declared in this scope|
D:\wxWidgets2.8\include\wx\list.h|408|error: 'strdup' was not declared in this scope|wxListKey(const wxChar *s) : m_keyType(wxKEY_STRING) { m_key.string = wxStrdup(s); } wxListKey(const wxString& s) : m_keyType(wxKEY_STRING) { m_key.string = wxStrdup(s.c_str()); }
Die Buildlog:
In file included from D:\wxWidgets2.8\include/wx/string.h:55, from D:\wxWidgets2.8\include/wx/memory.h:16, from D:\wxWidgets2.8\include/wx/object.h:20, from D:\wxWidgets2.8\include/wx\wx.h:16, from D:\C(++) Saves\wxWidgets Applications\TEMP\MAIN.cxx:1: D:\wxWidgets2.8\include/wx/buffer.h: In constructor 'wxCharBuffer::wxCharBuffer(const char*)': D:\wxWidgets2.8\include/wx/buffer.h:127: error: 'strdup' was not declared in this scope D:\wxWidgets2.8\include/wx/buffer.h: In member function 'wxCharBuffer& wxCharBuffer::operator=(const char*)': D:\wxWidgets2.8\include/wx/buffer.h:127: error: 'strdup' was not declared in this scope D:\wxWidgets2.8\include/wx/buffer.h: In constructor 'wxWCharBuffer::wxWCharBuffer(const wchar_t*)': D:\wxWidgets2.8\include/wx/buffer.h:134: error: '_wcsdup' was not declared in this scope D:\wxWidgets2.8\include/wx/buffer.h: In member function 'wxWCharBuffer& wxWCharBuffer::operator=(const wchar_t*)': D:\wxWidgets2.8\include/wx/buffer.h:134: error: '_wcsdup' was not declared in this scope In file included from D:\wxWidgets2.8\include/wx/memory.h:16, from D:\wxWidgets2.8\include/wx/object.h:20, from D:\wxWidgets2.8\include/wx\wx.h:16, from D:\C(++) Saves\wxWidgets Applications\TEMP\MAIN.cxx:1: D:\wxWidgets2.8\include/wx/string.h: In function 'int Stricmp(const char*, const char*)': D:\wxWidgets2.8\include/wx/string.h:141: error: 'strcasecmp' was not declared in this scope In file included from D:\wxWidgets2.8\include/wx\wx.h:18, from D:\C(++) Saves\wxWidgets Applications\TEMP\MAIN.cxx:1: D:\wxWidgets2.8\include/wx/list.h: In constructor 'wxListKey::wxListKey(const wxChar*)': D:\wxWidgets2.8\include/wx/list.h:406: error: 'strdup' was not declared in this scope D:\wxWidgets2.8\include/wx/list.h: In constructor 'wxListKey::wxListKey(const wxString&)': D:\wxWidgets2.8\include/wx/list.h:408: error: 'strdup' was not declared in this scope
Werd' 2.9 versuchen. Hört sich vielversprechend an.
-
Wenn du 2.9 versuchst, ist das ja gut, aber hier als Anhaltspunkt für die Fehlersuche:
strdup() muss irgendwo innerhalb des Makros DEFINE_BUFFER() expandiert werden. Da beim einen Mal das wide-character-strdup verwendet wird, ist strdup/_wcsdup() wahrscheinlich die Ersetzung von wxStrdupA/W. Ist das vielleicht abhängig von irgendwelchen Makros implementiert? Wurde <cstring> oder <string.h> irgendwo inkludiert?
-Im Internet nach strdup() suchen und danach, ob es im Standard ist oder compiler-spezifisch
-Ebenso für strcasecmp()
wxStrdup muss auch ein Makro sein, da dort ein Fehler mit strdup() auftaucht, obwohl strdup() gar nicht dasteht. Auch nachschauen.
-
Imho gibts keinen Grund bei 2.8.2 zu bleiben.
Und eventuell ist as Problem ja dann gelöst.
-
Hi!
Ja, hab mir jetzt 2.9.2 geholt, bereits gebaut und es versucht, bekomme aber 'immer noch' zwei Fehler (schon mal ein 'Fortschritt'
):
D:\wxWidgets-2.9.2\include\wx\wxcrtbase.h|757|error: '_strdup' was not declared in this scope| D:\wxWidgets-2.9.2\include\wx\string.h|177|error: 'strcasecmp' was not declared in this scope|
Da die Leute von wxWidgets selbst sagen, man soll bugs am besten selbst lösen, versuch ichs mal...
Edit:
Hab' folgende Zeilen gefunden:
#ifdef HAVE_STRCASECMP_IN_STRINGS_H #include <strings.h> // for strcasecmp() #endif // HAVE_STRCASECMP_IN_STRINGS_H
Leider nützt das auskommentieren der #ifdef's nichts..
-
Dann schau doch mal, wo das Makro definiert wird. (HAVE_STRCASECMP_IN_STRINGS_H)