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.
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.