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ür struct 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 mit std::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 von windows.h abschalten. Auch ein #define WIN32_LEAN_AND_MEAN hilft, weniger nicht benötigten Kram einzubinden und die Global Namespace Pollution minimal zu halten.


Anmelden zum Antworten