PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] wxWidgets richtig auf Ubuntu einrichten


zeckensack
2007-02-15, 01:45:08
Ich wollte mal ein paar GUI-Sachen zusammenwurschteln und habe mich daran erinnert dass wxWidgets dafür ganz akzeptabel war. Nur hatte ich das noch nie auf Linux versucht.

Ein minimales wxWidgets-Programm könnte zB so aussehen:#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

class
App: public wxApp
{
virtual bool OnInit();
};

class
Frame: public wxFrame
{
public:
Frame(const wxString& title,const wxPoint& pos,const wxSize& size);

void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);

private:
DECLARE_EVENT_TABLE()
};

enum
{
ID_Quit = 1,
ID_About,
};

BEGIN_EVENT_TABLE(Frame,wxFrame)
EVT_MENU(ID_Quit, Frame::OnQuit)
EVT_MENU(ID_About, Frame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(App)

bool
App::OnInit()
{
Frame *frame = new Frame(wxT("Hello World"),wxPoint(50,50),wxSize(450,340));
frame->Show(true);
SetTopWindow(frame);
return(true);
}

Frame::Frame(const wxString& title,const wxPoint& pos,const wxSize& size):
wxFrame(0,-1,title,pos,size)
{
wxMenu *menuFile = new wxMenu;

menuFile->Append(ID_About,wxT("&About..."));
menuFile->AppendSeparator();
menuFile->Append(ID_Quit,wxT("E&xit"));

wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile,wxT("&File"));

SetMenuBar(menuBar);

CreateStatusBar();
SetStatusText(wxT("Welcome to wxWidgets!"));
}

void
Frame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(true);
}

void
Frame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageBox(wxT("This is a wxWidgets' Hello world sample"),
wxT("About Hello World"),wxOK|wxICON_INFORMATION);
}Das ist im Grunde 1:1 aus dem Tutorial abgeschrieben, aber schon etwas aufgehübscht und mit Unicode-kompatiblen type-casts. Ziel dieses Threads soll zunächst werden dieses Programm zu kompilieren.

Ich habe mir also das Paket libwxgtk2.6-dev über Synaptic besorgt, und dann eine Weile geflucht und gefrickelt weil nichts ging (die Doku ist scheiße, mehr dazu später). Des Rätsels Lösung war es den Pfad /usr/include/wx-2.6/ manuell zu den Compiler-Optionen hinzuzufügen. Symlink von /usr/include/wx nach /usr/include/wx-2.6/wx/ wäre ja auch gegangen, hat der Installer halt nur nicht angelegt. Na. Gut.

Dann fehlte wx/setup.h, was man laut Doku und Wiki irgendwie erzeugen kann, aber auf Linux braucht man sich darum ja gar nicht zu kümmern, weil das ja superbequem über wx-config geht. Aha.
wx-config kann erstmal gar nichts, hat keine manpage und beschreibt sich selbst als Programm um Informationen zu liefern. Wie man das bedient, und warum, muss man freilich erraten, und an dieser Stelle sei nur gesagt dass es mir nicht gelang.
edit: Hier der Vollständigkeit halber der output von wx-config:ron@nutoka:~$ wx-config

wx-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--release] [--version-full]
[--list] [--host=HOST] [--toolkit=TOOLKIT] [--universal[=yes|no]]
[--unicode[=yes|no]] [--debug[=yes|no]] [--static[=yes|no]]
[--version[=VERSION]] [--basename] [--cc] [--cppflags] [--cflags]
[--cxxflags] [--rescomp] [--libs] [--cxx] [--ld] [--linkdeps]
[--utility=UTIL] [LIB ...]

wx-config returns information about the wxWidgets libraries available
on your system. It may be used to retrieve the information you require
to build applications using these libraries.

If alternative builds of wxWidgets exist on the system, you can use the
options: --prefix, --host, --toolkit, --unicode, --debug, --static,
--version and --universal, to select from them. Use the --list option to
show alternatives available which match specified criteria. The unicode,
debug, and universal options take an optional yes or no argument, while
host and version accept posix extended regex. The --utility option will
return the correct version of UTIL to use with the selected library build.
--linkdeps returns only static libraries for your makefile link rule deps.

Optional LIB arguments (comma or space separated) may be used to specify
the wxWidgets libraries that you wish to use. The magic "std" label may
be used to import all libraries that would be used by default if none were
specified explicitly. eg. wx-config --libs core,base.
Krass, oder?

Also erstmal eine setup.h in /usr/lib/wx/include/gtk2-unicode-release-2.6/ gefunden (WTF?) und rüberkopiert.

Gegen derlei Praktiken wehrt sich wxWidgets allerdings folgendermaßen:/usr/include/wx-2.6/wx/defs.h:41:13: error:
#error "No Target! You should use wx-config program for compilation flags!"Na gut.
Also aus dem Quellcode.
Habe mir das 2.8er Universal-Paket gezogen, tar xvf, ./configure, make, sudo make install, hat gute zwanzig Minuten gedauert und mir einen ganzen Haufen libs gebaut.

Das Skript gab mir als aller letztes dann noch den weisen Ratschlag auf den Weg dass ich eventuell meinen LD_PATH anpassen müsste, und überhaupt noch mein System konfigurieren müsste um das Produkt der Warterei auch nutzen zu können. Aber wie? Fehlanzeige. Installiert im weiteren Sinn wurde durch make install freilich auch nichts. Die sos wurden gar nicht erst nach /usr/lib kopiert (wo die anderen Versionen 2.4 und 2.6 recht zahlreich vertreten sind). In dem ominösen Verzeichnis /usr/lib/wx/ tat sich nichts, und auch ein neues Verzeichnis /usr/include/wx-2.8/, was eigentlich zu erwarten gewesen wäre, ist nicht erzeugt worden.


So. Ich gebe sofort zu nicht der mächtigste aller Admin-Götter zu sein, aber die wxWidgets-Maintainer, insbesondere Abteilung Dokumentation und Installation, würde ich gerne mal an den Schultern packen und eine Weile beherzt schütteln. Wenn ihr einen kennt, gebt ihm oder ihr mal einen kräftigen Tritt von mir. Kostenloser Hinweis: die Dokumentation wird primär von Leuten gelesen die sich mit dem Kram noch nicht auskennen.


Aber kommen wir zurück zu Lösung meines Problems =)
Wie ihr seht habe ich schon einiges probiert. Wer mir "Benutz' wx-config" empfehlen möchte, sollte sich genau überlegen ob er das auch so ausführen kann dass es nützlich wird, und ob er sich sicher ist dass das auch etwas bewirkt.

Ein HOWTO "Was mache ich auf einer frischen Ubuntu 6.10-Installation um wxWidgets-Programme kompilieren zu können" wäre das Optimum.

Ganon
2007-02-15, 08:21:25
Afaik:

g++ `wx-config --cppflags --linkdeps --unicode=yes` <Deine Sachen hier>

Kann sein das noch was fehlt aus der Liste.

Simon
2007-02-15, 08:29:44
Hallo,

Aber kommen wir zurück zu Lösung meines Problems =)
Wie ihr seht habe ich schon einiges probiert. Wer mir "Benutz' wx-config" empfehlen möchte, sollte sich genau überlegen ob er das auch so ausführen kann dass es nützlich wird, und ob er sich sicher ist dass das auch etwas bewirkt.
Es gibt eigentlich zu allen Bibliotheken unter Linux ein Programm/Skript namens "<lib-name>-config". Dieses gibt dir mit den passenden Argumenten die nötigen Pfade, um die Lib zu benutzen. Z.B. steht in vielen meiner Makefiles:

CFLAGS = `sdl-config --cflags`
LDFLAGS = `sdl-config --libs`

Mit der ersten Zeile wird das Skript nach dem Include-Verzeichnis sowie weiteren benötigten Flags gefragt. Die zweite Zeile holt sich die Linker-Einstellungen. Bei dir wäre das analog dazu:

CFLAGS = `wx-config --cflags`
LDFLAGS = `wx-config --libs`

Der Vorteil dieser Methode ist, dass du nirgends fest reinschreiben mußt, wo sich die Teile einer Bibliothek befinden (wie du es aber getan hast ;) ). So kann ein User auch die benötigte Bibliothek in $HOME installieren und trotzdem dein Programm kompilieren, ohne irgendwas zu ändern oder den Compiler einzurichten (wie bei MS VS).
Edit: Wegen der setup.h schau ich nachher mal, hab wxWidgets bisher nur mit Python genutzt ;)

Ein HOWTO "Was mache ich auf einer frischen Ubuntu 6.10-Installation um wxWidgets-Programme kompilieren zu können" wäre das Optimum.
wx-config benutzen :D ;)
Noch ein Edit: Dein Problem hat weniger mit Ubuntu oder wxWidgets zu tun, sondern eher mit mangelnden Kenntnissen der örtlichen Gegebenheiten ;(

zeckensack
2007-02-15, 09:53:31
Hämmer!
Kompiliert ohne Fehler. Läuft zwar nicht, weil die 2.8er so, die ich bekanntlich aus den Quellen gebaut habe, beim Starten dann doch nicht auffindbar ist, aber wx-config v2.6 darauf besteht dass dies die einzige verfügbare Version ist (über wx-config --list ermittelt), auch nach sudo make uninstall und reinstall der dev2.6 ... aber das wird wohl das kleinere Problem sein. Hoffe ich. Vielleicht.
Die 2.8-dev zu bauen war wohl ein Fehler, so gesehen, denn nun scheine ich sie nicht mehr wegzukriegen.
Vielleicht versuche ich sie nochmal richtig hinzukriegen, evtl später mehr dazu.

Trotzdem riesen Dank euch beiden.
*knuddel*
Noch ein Edit: Dein Problem hat weniger mit Ubuntu oder wxWidgets zu tun, sondern eher mit mangelnden Kenntnissen der örtlichen Gegebenheiten ;(Für meine ersten Versuche mit X11 und glut brauchte ich das jedenfalls nicht.
Es mag ja sein dass es "so üblich" ist, aber irgendwoher muss die Information ja auch erstmal kommen. Ich hätte mir gewünscht dass das irgendwo steht, dann hätte ich es auch gelesen. Ernsthaft. Eine kurze Beispielkommandozeile wie ihr beide sie angegeben habt hätte doch schon genügt um mich auf den richtigen Weg zu bringen, oder evtl irgendein Hinweis in dem Textschwall von wx-config dass man dieses Kommando sinnvollerweise in die GCC-Zeile einfügen kann/soll.

Simon
2007-02-15, 10:34:49
Hämmer!
Kompiliert ohne Fehler. Läuft zwar nicht, weil die 2.8er so, die ich bekanntlich aus den Quellen gebaut habe, beim Starten dann doch nicht auffindbar ist, aber wx-config v2.6 darauf besteht dass dies die einzige verfügbare Version ist (über wx-config --list ermittelt)
Das wx-config wird wohl pkg-config nutzen, um die installierten Versionen zu ermitteln. Bei der wx2.8 Version wird das Makefile dort sicher nix eingetragen haben, da das ganze bischen distributionsabhängig ist.

auch nach sudo make uninstall und reinstall der dev2.6 ... aber das wird wohl das kleinere Problem sein. Hoffe ich. Vielleicht.
:D

Die 2.8-dev zu bauen war wohl ein Fehler, so gesehen, denn nun scheine ich sie nicht mehr wegzukriegen.
Vielleicht versuche ich sie nochmal richtig hinzukriegen, evtl später mehr dazu.
Wenn du das src-Verzeichnis davon noch hast, sollte, ein

make uninstall
reichen, um es wieder zu entfernen. Falls nicht, neues src-Paket besorgen, entpacken, configure laufen lassen und dann das uninstall. Oder alles per Hand löschen, sollte auch fix gehen...
Alternativ beim nächsten Mal "checkinstall" benutzen, das baut dir passende Paket für den Paket Manager, die du dann sauber wieder deinstallieren kannst =)

Es mag ja sein dass es "so üblich" ist, aber irgendwoher muss die Information ja auch erstmal kommen. Ich hätte mir gewünscht dass das irgendwo steht, dann hätte ich es auch gelesen. Ernsthaft. Eine kurze Beispielkommandozeile wie ihr beide sie angegeben habt hätte doch schon genügt um mich auf den richtigen Weg zu bringen, oder evtl irgendein Hinweis in dem Textschwall von wx-config dass man dieses Kommando sinnvollerweise in die GCC-Zeile einfügen kann/soll.
Ja, das kenn ich. Ich hab das auch zuerst in anderer Leute Makefiles gesehen und dann das bei mir so abgeändert. Falls du noch was über Makefiles brauchst: Klick mich (http://www.ijon.de/comp/tutorials/makefile.html) Das Beispiel im Abschnitt "Variablen in Makefiles" ist richtig gut und verwende ich immer wieder ;)

MadMan2k
2007-02-15, 13:54:05
wenns primär auf linux laufen soll, würde ich gtk bevorzugen, da sich das einfahc besser ins system integriert.
hat außerdem ne schöne dokumentation:
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch03.html

edit: außerdem hast du bei GTK glade:
http://glade.gnome.org/

Ganon
2007-02-15, 14:07:09
wxWidgets basiert doch auf GTK.

MadMan2k
2007-02-15, 15:29:34
es benutzt die GTK Widgets zum anzeigen, implementiert aber ein eigenes Verhalten. Zudem hast du von wx aus keinen direkten Zugriff auf das Icontheme etc.

das gleiche kannst übrigens auch bei den anderen "GTK"-Toolkits wie Swing, SWT und XUL beobachten...

zeckensack
2007-02-16, 02:13:49
Wenn du das src-Verzeichnis davon noch hast, sollte, ein

make uninstall
reichen, um es wieder zu entfernen.Nein, leider bisher nicht. Das Verzeichnis mit den Quellen habe ich mir natürlich aufgehoben. Als User ausgeführt produzierte make install schon Fehlermeldungen, also habe ich sudo make install ausgeführt, und demzufolge auch sudo make uninstall.
Trotzdem ist meine Konfiguration immer noch halb/halb 2.6 und 2.8. Der Fehler könnte in der "halben" Ausführung von make install als User liegen.
Falls nicht, neues src-Paket besorgen, entpacken, configure laufen lassen und dann das uninstall.:???:
Neuer als 2.8, die Version die ich loswerden will?Oder alles per Hand löschen, sollte auch fix gehen...Jein ... ich habe keinen Plan warum mich wx-config auf die Version 2.8 verweisen will. wx-config ist ein Symlink über zwei Ecken auf /usr/lib/wx/config/gtk2-unicode-release-2.6, aber wenn ich eben dieses aufrufe verweist es mich auf eine 2.8er Version die irgendwo in meinem Home-Verzeichnis lebt (wo ich's kompiliert habe).

Das ist ein 39k Shellscript, und ich habe keine Ahnung wie ich da etwas ausrichten soll.

Ja, das kenn ich. Ich hab das auch zuerst in anderer Leute Makefiles gesehen und dann das bei mir so abgeändert. Falls du noch was über Makefiles brauchst: Klick mich (http://www.ijon.de/comp/tutorials/makefile.html) Das Beispiel im Abschnitt "Variablen in Makefiles" ist richtig gut und verwende ich immer wieder ;)Ich mache eigentlich sehr viel mit Makefiles, lasse mir von GNU Make auch Webseiten updaten, Dokumentation generieren und so Kram halt.
Was ich noch nicht kannte war der Trick mit den zwei '', um den Output von Kommandos einzubetten.

zeckensack
2007-02-16, 02:23:51
wenns primär auf linux laufen soll, würde ich gtk bevorzugen, da sich das einfahc besser ins system integriert.
hat außerdem ne schöne dokumentation:
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch03.html

edit: außerdem hast du bei GTK glade:
http://glade.gnome.org/Das soll mal auf der PS3, PC-Linux und Windows laufen.
Ich bin echt ganz kurz davor die Brocken hinzuschmeißen und zu GTK zu wechseln. Ich wollte aus der wxWidgets-Familie eigentlich auch den XML-Konfigurationskram nutzen, aber das ist auch nicht so wichtig dass ich dafür weitere Qualen in Kauf nehme.

Die GUI selbst ist schön einfach. Könnte ich auch direkt in X11 zusammenstöpseln. Dann wäre die Windows-Version allerdings gestorben.

Wuzel
2007-02-16, 03:14:42
Die 2.8'er nochmal drüberhauen, die configure Flags sind entscheidend das der Build ohne Errors durchgeht. Make Install geht vom Prinzip nur als SU - ausser man hat einen alternativen prefix zu einem dir wo man als User rumhampeln kann.
Auch immer prefix=/usr mit rein hängen - sonst aua und durcheinander.
achja - deine libconf würde ich auch mal rebuilden ;)

Ansonsten: Die Install hat bisher reibungslos unter allen dist's gefunzt - sowohl über den PM wie auch from scratch (GTK Version).
Momentan würde ich nur die 2.6'er empfehlen, da die 2.8'er einige bind's neuerer libs benötigt. Unter Ubuntu 6.10 würde ich erst recht kein 2'8er drauf knüppeln ;)

Wuzel
2007-02-16, 03:34:58
wenns primär auf linux laufen soll, würde ich gtk bevorzugen, da sich das einfahc besser ins system integriert.
hat außerdem ne schöne dokumentation:
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch03.html

edit: außerdem hast du bei GTK glade:
http://glade.gnome.org/

Der C++ Wrapper ist zum schreien, die Datenbindung mit den TreeStores unter OO Sprachen nicht wirklich angenehm.
Gerade beim Debuggen unter anderen Plattformen kommt der verdrehte C Unterbau so richtig hübsch raus.... Mingw's g++ geht jedenfalls ab wie Schnitzel wenn du unter Win mal nen größeres Projekt durch nagelst - und gdb hilft dann auch nichts mehr ;(

Wenn GTK dann mit C oder mit Vorsicht O C, da hat man keinen Trouble und alles ist schön flauschig :uhippie:

wx ist auch nicht soooo das gelbe vom Ei, aber 'komplett', auch das 'pseudo' Speicher Management der Widgets macht Laune - kein Stress mit großen Aufräumarbeiten, das rumhampeln mit den Daten Strukturen macht STL Freaks Anfangs nicht so richtig Spaß, vor allem weil's recht umständlich wirkt - aber man gewöhnt sich an alles und Notfalls kann man über einen Flag den STL Support ohne aua reinhauen.

zeckensack
2007-02-16, 04:45:02
Die 2.8'er nochmal drüberhauen, die configure Flags sind entscheidend das der Build ohne Errors durchgeht. Make Install geht vom Prinzip nur als SU - ausser man hat einen alternativen prefix zu einem dir wo man als User rumhampeln kann.
Auch immer prefix=/usr mit rein hängen - sonst aua und durcheinander.
achja - deine libconf würde ich auch mal rebuilden ;)Jahahaha, das ging erstmal nicht, musste erst sudo make clean drüberjagen damit er aufhört irgendwelche libgnomeprint-Targets nicht bauen zu können und daran zu verrecken. Danach ging's dann doch.
Also sudo make clean
./configure prefix=/usr
make
sudo make install

Fabelhaft. Jetzt muss ich mir nur noch überlegen wie ich die wx-config-Flags am schlauesten an Netbeans vorbeischleuse ...

Das Problem darf als gelöst betrachtet werden. Danke an alle beteiligten =)

zeckensack
2007-02-16, 06:26:09
Für die nachfolgenden Generationen hier noch das Netbeans-konforme Makefile

# von Netbeans generiertes Geraffel, vordefinierte Targets ...
# bla
# bla

include nbproject/Makefile-impl.mk

# Jetzt aber: für wxWidgets *am Ende* folgendes hinzufügen

LDFLAGS += $(shell wx-config --libs --prefix=/usr)
CPPFLAGS += $(shell wx-config --cxxflags --prefix=/usr)
CFLAGS += $(shell wx-config --cflags --prefix=/usr)Welch eine Erleichterung :redface: