Wxformbuilder tutorial



  • hallo,

    ich habe mir grade den wxformbuilder angesehen und wollte folgendes Tutorial mal ausprobieren: http://wiki.wxformbuilder.org/Tutorials/UsingWxFormBuilder

    am Ende des Tutorials steht der Satz "Einfach kompilieren ..."
    , aber so einfach isses wohl nich 🙄

    ich habe bisher immer mit windows gearbeitet (da gabs immer einen compilier-button) und jetzt bin ich gezwungenermaßen bei linux, wo ich allerdings nur das compilieren mit "make" und nem makefile kannte - das gibts hier aber nicht

    also hab ich mal nachgeguckt nach meinem g++ compiler und ihm folgendes gesagt:

    g++ wxWidgetsApp.cpp `wx-config --libs` `wx-config --cxxflags` -o tutorial

    dann kriegte ich folgenden fehler:

    /tmp/cce0v3YF.o: In funktion `wxWidgetsApp::OnInit()`:
    wxWidgetsApp.cpp:((.text+0x1c3):undefined reference to `TutorialDialog::TutorialDialog(wxWindow*)

    collect2: ld gab 1 als Ende-Status zurück

    da das ein gegebenes Tutorial ist, ist jetzt ja meine Vermutung das ich was mit der Compileranweisung vergeigt habe ...

    würde gerne mal eine fachkundige Meinung hören

    GRüße
    Gollom



  • Versuche mal `wx-config --cppflags` anstatt `wx-config --cxxflags` einzugeben. Vielleicht geht es dann.



  • Als Anfang kannst Du mit Folgendes beginnen. Erstelle eine Basisdatei (bei mir base.h und base.cpp), dass für die Implementierung deines Programms zuständig ist. Danach starte die IDE wxFormBuilder. Gib in das Eigenschaftsfenster bei name und file einen Projektnamen ein. Speichere den Projektnamen mit der gleichen Bezeichnung wie in den file-Eintrag des Eigenschaftsfensters. Hast Du dies getan, so kannst Du mit dem Designer ein Fenster erstellen. Damit die Komponente wie wxPanel angenommen werden können, must Du ein Sizer einfügen, dass Du bei Layout findest. Bist Du mit der Gestaltung fertig, speicher es ab und drück auf das Zahnrad-Symbol ("Generate Code"). Jetzt werden alle Sachen in zwei Dateien gepackt (Headerdatei und C++-Quelltextdatei). Bei meinem Beispiel ist der Projektname gui deshalb wurde bei mir gui.h und gui.cpp erstellt. Nun bevor Du dein Projekt beendest, würde ich noch eine Ableitung erstellen, dass Du im Eintrag Tools findest ("Generate Inherited Class"). Bei mir habe ich als Klassennamen srFrame und als Dateinamen main eingetragen. Wenn Du alle Schritte befolgt und dir die gepostete Beispiele angeschaut hast, sollte alles Funktionieren.

    Makefile

    #Dein Makefile
    
    CC			= g++
    CFLAGS		= `wx-config --cppflags`
    CLIBS		= `wx-config --libs`
    OBJECTS		= base.o main.o gui.o
    
    programm: $(OBJECTS)
    	$(CC) $(CLIBS) $(OBJECTS) -o $@ -Wall
    
    %.o: %.cpp
    	$(CC) -c $(CFLAGS) $< -o $@ -Wall
    
    remove:
    	shred -uvn 20 programm *.o
    
    refresh:
    	shred -uvn 20 *~
    

    base.h

    ////////////////////////////////////////////////////////////////////////////////
    /// Die Headerdatei base
    ////////////////////////////////////////////////////////////////////////////////
    
    #ifndef _BASE_H_
    #define _BASE_H_
    
    #include <wx/wx.h>
    
    ////////////////////////////////////////////////////////////////////////////////
    /// Der srApp-Baustein
    ////////////////////////////////////////////////////////////////////////////////
    
    class srApp : public wxApp
    {
    	public:
    		virtual bool OnInit();
    };
    
    #endif
    

    base.cpp

    ////////////////////////////////////////////////////////////////////////////////
    /// Die wxWidgets-Schablone
    ////////////////////////////////////////////////////////////////////////////////
    
    #include "base.h"
    #include "main.h"
    
    IMPLEMENT_APP(srApp)
    
    bool srApp::OnInit()
    {
    	srFrame *frame = new srFrame(NULL);
    	frame->Show(TRUE);
    	this->SetTopWindow(frame);
    	return TRUE;
    }
    

    gui.h und gui.cpp werden mit wxFormBuilder erstellt.
    main.h und main.cpp sind abgeleitete Klassen des Projekts gui.

    Gruß,
    Stefan



  • danke - werd ich gleich mal ausprobieren 😃



  • da hat sich wohl ein fehler ins makefile eingeschlichen

    makefile:10: *** missing separator. Schluss.

    ansonsten hab ich einfach oben mal andere namen eingesetzt für meine entsprechenden dateien ...

    #Dein Makefile
    
    CC            = g++
    CFLAGS        = `wx-config --cppflags`
    CLIBS        = `wx-config --libs`
    OBJECTS        = halloWelt.o base.o hwelt.o
    
    programm: $(OBJECTS)
        $(CC) $(CLIBS) $(OBJECTS) -o $@ -Wall
    
    %.o: %.cpp
        $(CC) -c $(CFLAGS) $< -o $@ -Wall
    
    remove:
        shred -uvn 20 programm *.o
    
    refresh:
        shred -uvn 20 *~
    


  • ganz oben muss noch ne leerzeile hin - also ist der fehler in zeile 9



  • und wenn ich meine tolle zeile von oben zum kompilieren benutze (also dieses g++ ...) dann kommt der gleiche Fehler wie oben ...

    kommt mir komisch vor, weil "undefined reference" heißt doch das er mit dem kompilieren keine probleme hat, sondern die klasse nicht findet, oder?



  • Hast Du den Klassennamen und die eingebundenen Headerdateien in den Dateien base.h und base.cpp angepasst?



  • Der Makefile ist ganz in ordnung. Der C++-Kompiler sucht wahrscheinlich eine Headerdatei oder Klassennamen, den er nicht findet. Deshalb vergleiche den Klassennamen mit den anderen Headerdateien.



  • hab ich gemacht - und da steht ja auch ganz eindeutig
    "makefile:10" - heißt das nicht makefile zeile 10?

    gibt es evtl. unterschiede bei der linuxversion die ich habe? (kubuntu)

    ich hab das makefile übrigens auch ml beim tutorial ausprobiert und die entsprechenden 3 dateien oben eingesetzt und da kam auch der fehler mit "makefile:10 ..."
    und da sind die klassenname ja auf jeden fall richtig ...

    ich bin verwirrt 😮 😕



  • Ich bin kein Linux-Experte, daher kann ich es dir nicht sagen. Es könnte vielleicht sein, dass Ubuntu ein Begrenzungszeichen in der 10. Zeile erwartet. Aber das ist eine reine Vermutung. Versuche mal, anstatt ein Makefile ein Shell-Skript zu verwenden, vielleicht klappt es dann.

    #!/bin/sh
    
    g++ `wx-config --cppflags` `wx-config --libs` base.cpp halloWelt.cpp hwelt.cpp -o programm -Wall
    


  • hat geklappt - ich habs ja auch zuerst mit nem shellskript versucht, aber nicht alle .cpp-dateien aufgelistet

    was heißt eigentlich das "-Wall" am Ende? Wozu ist das gut?

    g++ `wx-config --cppflags` `wx-config --libs` base.cpp halloWelt.cpp hwelt.cpp -o programm -Wall
    

    und wie sieht so ein Begrenzungszeichen im makefile aus? sind das die "$"-Zeichen, die da überall drinn stehen?

    auf jeden Fall danke soweit - das tutorial funktioniert damit auch



  • Es freut mich zu lesen, dass alles funktioniert. 🙂
    Die Option -Wall steht für "Warning All". Sie zeigt alle Fehlermeldungen an, die in dein Programm gefunden werden.
    Ich weis nicht, was Ubuntu als Begrenzungszeichen erwartet, da ich eine andere Linux-Distribution benutze.



  • na evtl. findet sich ja noch wer der ahnung von makefiles unter (k)ubuntu hat

    Aber ich bin grade auf noch ein Problem gestoßen: und zwar kann ich beim Formbuilder ja ein "wxNotebook" erstellen und da unter Windows verschiedene panels reinpacken, die ich dann alle an der oberen leiste anklicken und ausklappen kann.

    Unter Linux wird zwar meine Windowsform richtig angezeigt, aber ich kann da keine neuen Panels reinpacken. Weiß jemand woran das liegt? Muss ich da noch was zusätzlich installieren oder einstellen?


  • Mod

    gollom schrieb:

    na evtl. findet sich ja noch wer der ahnung von makefiles unter (k)ubuntu hat

    Aber ich bin grade auf noch ein Problem gestoßen: und zwar kann ich beim Formbuilder ja ein "wxNotebook" erstellen und da unter Windows verschiedene panels reinpacken, die ich dann alle an der oberen leiste anklicken und ausklappen kann.

    Unter Linux wird zwar meine Windowsform richtig angezeigt, aber ich kann da keine neuen Panels reinpacken. Weiß jemand woran das liegt? Muss ich da noch was zusätzlich installieren oder einstellen?

    Hm, versuch mal wxSmith von Code::Blocks, der soll auch unter Linux sehr gut laufen. Ansonsten einfach per Hand einfügen, notebook->Add(panel,"1",true);

    Was makefiles angeht, lies dir mal das Manual durch, oder such mal nach ultimatives makefile hier im Forum.


Anmelden zum Antworten