TDMGCC Fehler
-
Hallo zusammen,
ich schreibe mit CodeLite ein Programm welches unter Linux und unter Windows laufen soll. Unter Linux kompiliert das ganze ohne Fehler und läuft auch.
Unter Windows bekommen ich folgende Fehler:
cd Z:\wxWidgets\Projekte\CPM_Image-File_Explorer\cmake-build-Debug-MSW\CIFE && C:/TDM-GCC-64/bin/mingw32-make.exe -j2 SHELL=cmd.exe -e Consolidate compiler generated dependencies of target CIFE [ 9%] Building CXX object CMakeFiles/CIFE.dir/Ui_MainWindow_bitmaps.cpp.obj [ 18%] Building CXX object CMakeFiles/CIFE.dir/ImageFileTools.cpp.obj [ 27%] Building CXX object CMakeFiles/CIFE.dir/GuiInterface.cpp.obj [ 36%] Building CXX object CMakeFiles/CIFE.dir/Ui_MainWindow.cpp.obj [ 45%] Building CXX object CMakeFiles/CIFE.dir/MainWindow.cpp.obj [ 54%] Building CXX object CMakeFiles/CIFE.dir/main.cpp.obj [ 63%] Building CXX object CMakeFiles/CIFE.dir/cpmls.cpp.obj In file included from C:/TDM-GCC-64/x86_64-w64-mingw32/include/oleidl.h:7, from C:/TDM-GCC-64/x86_64-w64-mingw32/include/ole2.h:38, from C:/TDM-GCC-64/x86_64-w64-mingw32/include/wtypes.h:13, from C:/TDM-GCC-64/x86_64-w64-mingw32/include/winscard.h:10, from C:/TDM-GCC-64/x86_64-w64-mingw32/include/windows.h:97, from C:/wxWidgets-3.1.5/include/wx/msw/wrapwin.h:43, from C:/wxWidgets-3.1.5/include/wx/msw/init.h:27, from C:/wxWidgets-3.1.5/include/wx/init.h:58, from C:/wxWidgets-3.1.5/include/wx/app.h:23, from C:/wxWidgets-3.1.5/include/wx/wx.h:25, from Z:\wxWidgets\Projekte\CPM_Image-File_Explorer\CIFE\main.cpp:22: Z:\wxWidgets\Projekte\CPM_Image-File_Explorer\CIFE\ImageFileTools.h:36:55: error: expected ',' or '...' before 'struct' 36 | void showDirectory(int dirType, GuiInterface *interface); | ^~~~~~~~~ mingw32-make.exe[2]: *** [CMakeFiles/CIFE.dir/main.cpp.obj] Error 1 CMakeFiles\Makefile2:81: recipe for target 'CMakeFiles/CIFE.dir/all' failed Makefile:89: recipe for target 'all' failed ==== build ended with errors (1 errors, 0 warnings), total time: 00:00:07 seconds ===
Die Klasse 'GuiInterface' schaut folgendermaßen aus:
#ifndef GUIINTERFACE_H #define GUIINTERFACE_H // -------------------------------------------------------------------------------- #include <wx/string.h> // -------------------------------------------------------------------------------- class wxTextCtrl; class wxListView; class wxStaticText; // -------------------------------------------------------------------------------- class GuiInterface { public: // Attributes enum msgColor {msgColRed, msgColGreen, msgColBlack}; public: // Methods void printMsg(wxString msg, msgColor col = msgColBlack); void printDirInfo(wxString info); void setDirHeader(wxString header); void printDirEntry(int col, int row, wxString data); public: // Constructor & Destructor GuiInterface(wxTextCtrl *textCtrl, wxListView *listView, wxStaticText *stattext); ~GuiInterface(); protected: // Event Methods private: // Attributes wxTextCtrl *textMessages; wxListView *listContents; wxStaticText *textDirInfo; private: // Methods }; // -------------------------------------------------------------------------------- #endif // GUIINTERFACE_H
#include "GuiInterface.h" // -------------------------------------------------------------------------------- #include <wx/colour.h> #include <wx/textctrl.h> #include <wx/listctrl.h> #include <wx/stattext.h> #include <wx/tokenzr.h> // -------------------------------------------------------------------------------- GuiInterface::GuiInterface(wxTextCtrl *textCtrl, wxListView *listView, wxStaticText *stattext) { textMessages = textCtrl; listContents = listView; textDirInfo = stattext; } // -------------------------------------------------------------------------------- GuiInterface::~GuiInterface() { } // -------------------------------------------------------------------------------- void GuiInterface::printMsg(wxString msg, msgColor col) { switch (col) { case msgColBlack: { textMessages->SetForegroundColour(*wxBLACK); break; } case msgColRed: { textMessages->SetForegroundColour(*wxRED); break; } case msgColGreen: { textMessages->SetForegroundColour(*wxGREEN); break; } } textMessages->AppendText(msg); } // -------------------------------------------------------------------------------- void GuiInterface::printDirInfo(wxString info) { textDirInfo->SetLabel(info); } // -------------------------------------------------------------------------------- void GuiInterface::setDirHeader(wxString header) { listContents->ClearAll(); wxStringTokenizer tokenizer(header, ";"); int charWidth = listContents->GetFont().GetPointSize(); while (tokenizer.HasMoreTokens()) { wxString token = tokenizer.GetNextToken(); int width = wxAtoi(tokenizer.GetNextToken()); wxString align = tokenizer.GetNextToken().Upper(); wxListColumnFormat format = wxLIST_FORMAT_CENTER; if (align == "L") { format = wxLIST_FORMAT_LEFT; } else if (align == "R") { format = wxLIST_FORMAT_RIGHT; } else if (align == "C") { format = wxLIST_FORMAT_CENTER; } listContents->AppendColumn(token, format, ((width * charWidth) + 1)); } } // -------------------------------------------------------------------------------- void GuiInterface::printDirEntry(int col, int row, wxString data) { if (col == 0) { listContents->InsertItem(row, data); } else { listContents->SetItem(row, col, data); } } // --------------------------------------------------------------------------------
Ich habe es bis jetzt leider nicht geschafft den Fehler unter Windows in den Griff zu bekommen. Wäre schön wenn mir jemand helfen kann.
Grüße Netzschleicher
-
interface
ist ein Aliasname fürstruct
in einer der Windows-Header (daher auch die Fehlermeldung), s.a. What is the “interface” keyword in MSVC?Also entweder die Variable umbenennen oder ein
#undef interface
vorher hinzufügen.
-
Welch blöder Fehler. Auf die Idee den Bezeichner einfach mal umzubenennen bin ich nicht gekommen, da es unter Linux ja einwandfrei läuft.
Vielen Dank für den Schubs in die richtige Richtung.
-
@Netzschleicher sagte in TDMGCC Fehler:
Welch blöder Fehler. Auf die Idee den Bezeichner einfach mal umzubenennen bin ich nicht gekommen, da es unter Linux ja einwandfrei läuft.
Vielen Dank für den Schubs in die richtige Richtung.
Das kannste dir in Bezug auf Windows-Header mal merken. Die sind berüchtigt für solche unqualifizierten Makros, die sehr gerne mit eigenen Variablennamen kollidieren. Andere heisse Kandidaten sind
min
,max
,far
,near
.min
/max
kollidieren dann gerne mitstd::min
/std::max
und führen teilweise zu äußerst seltsamen Fehlern, wenn man das nicht weiss. Die beiden speziellen Makros lassen sich aber durch ein#define NOMINMAX
vor dem einbinden vonwindows.h
abschalten. Auch ein#define WIN32_LEAN_AND_MEAN
hilft, weniger nicht benötigten Kram einzubinden und die Global Namespace Pollution minimal zu halten.