wxWidgets auf macOS installieren

wxWidgets lässt sich einfach auf dem Mac installieren. Hier das Beispiel für Monterey.

Zuerst checken wir via Git den Code des aktuellen Projekts aus

git clone https://github.com/wxWidgets/wxWidgets.git

Dann wechseln wir in das ausgecheckte Verzeichnis

cd wxWidgets

und checken noch einige Submodule aus

git submodule update --init 3rdparty/nanosvg
git submodule update --init 3rdparty/catch
git submodule update --init src/jpeg
git submodule update --init src/png
git submodule update --init 3rdparty/pcre

Wir erstellen das Verzeichnis, in das hineinkompiliert werden soll, und wechseln dorthin

 mkdir osx && cd osx

Dann konfigurieren wir noch das Projekt, kompilieren und installieren es

../configure --disable-shared --enable-stl --with-cxx=14 --with-macosx-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk --enable-optimise --prefix=/usr/local/wxMac --enable-monolithic  --without-libjbig --without-libtiff
make -j4
sudo make install

wxWidgets ist jetzt einsatzbereit.

wxWidgets-Entwicklung mit dem QtCreator (zumindest auf macOS, Linux und FreeBSD)

Es ist kaum zu glauben, aber bis vor einer kurzen Zeit benutzte ich keine IDE. Oftmals entwickle ich immer noch gerne ohne IDE, doch für Qt nehme ich QtCreator und ich finde die IDE ganz “nett”. Ich kenne etliche Systeme, und keins gefällt mir tatsächlich so gut wie QtCreator, außer NetBeans für Java vielleicht. Damit bin ich aber vermutlich allein (:

Ich wollte einmal wissen, wie hoch der Aufwand ist, wxWidgets in QtCreator einzubinden. Es ist sehr einfach. Wie es geht, zeigt dieser Artikel.

wxWidgets nutzt auf unixoiden System “wx-config” als Kommandozeilenkonfigurationswerkzeug. Das bedeutet, dass man einfach in seinen Compileraufruf “wx-config” einbaut. Ein einfaches Beispiel könnte:

# c++ *.cpp -o test `wx-config --libs --cppflags`

sein.

Also einfach mal den QtCreator starten und ein neues Konsolenprojekt erstellen. In der Projektdatei (*.pro) dann folgende Zeilen hinzufügen:

INCLUDEPATH += /usr/local/wxWidgets/include/wx-3.0
wxCXXFLAGS = $$system(/usr/local/wxWidgets/bin/wx-config --cxxflags --unicode=yes --debug=no)
wxLinkOptions = $$system(/usr/local/wxWidgets/bin/wx-config --debug=no --libs --unicode=yes)
LIBS += $$wxLinkOptions
QMAKE_CXXFLAGS_RELEASE += $$wxCXXFLAGS
QMAKE_CXXFLAGS_DEBUG += $$wxCXXFLAGS

Es ist natürlich darauf zu achten, dass der Pfad für wx-config sowie der Includepfad stimmen und angepasst werden.

Jetzt ist es möglich, einfach sein wxWidgets-Programm zu schreiben und mit Klick auf den Play-Button zu kompilieren und zu starten.

Hier noch ein kleines wxWidgets-C++-Beispiel:

#include <wx/wx.h>

class MyApp : public wxApp {

	public:
		bool OnInit();

};

IMPLEMENT_APP(MyApp)

class MyFrame : public wxFrame {

	public:
		MyFrame();
	
	private:
		enum {
			HELLO_WORLD_BUTTON
		};
	
		wxPanel *mainPanel;
		wxBoxSizer *mainBoxSizer;
		wxButton *helloWorldButton;
		wxTextCtrl *helloWorldTextCtrl;
	
	protected:
		DECLARE_EVENT_TABLE()
		
		void HelloWorldEvent(wxCommandEvent &WXUNUSED(event));

};

bool MyApp::OnInit() {
	MyFrame *f = new MyFrame;
	f->Show();
	SetTopWindow(f);
	return true;
}

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
	EVT_BUTTON(HELLO_WORLD_BUTTON, MyFrame::HelloWorldEvent)
wxEND_EVENT_TABLE()

MyFrame::MyFrame() : wxFrame(NULL, -1, _("Hello World")) {
	mainPanel = new wxPanel(this, -1);
	mainBoxSizer = new wxBoxSizer(wxHORIZONTAL);
	
	helloWorldButton = new wxButton(mainPanel, HELLO_WORLD_BUTTON, _("Say Hello World"));
	mainBoxSizer->Add(helloWorldButton);
	
	mainBoxSizer->AddSpacer(5);
	
	helloWorldTextCtrl = new wxTextCtrl(mainPanel, -1);
	mainBoxSizer->Add(helloWorldTextCtrl);
	
	mainPanel->SetSizer(mainBoxSizer);
	mainBoxSizer->SetSizeHints(this);
}

void MyFrame::HelloWorldEvent(wxCommandEvent &WXUNUSED(event)) {
	helloWorldTextCtrl->SetValue(_("Hello World"));
}

Minecraft

Ich beschäftige mich seit meinem achten Lebensjahr mit Computern. Das sind jetzt genau vierunddreißig Jahre. Natürlich blieben da Computerspiele nicht aus. Es begann mit einem Atari 2600, ging über in einen Schneider CPC464, der dann von einem Amiga 500 abgelöst wurde. Dann hielt der PC Einzug ins Kinderzimmer und lange Zeit später, auch der Mac.

Alle Systeme eignen sich zum Spielen von Computerspielen, allen voran natürlich das Atari 2600. Obwohl diese Spiele absolut nicht meine Hauptbeschäftigung sind, kam ich dennoch nicht daran vorbei. Ich spielte alles Mögliche. Gerne erinnere ich mich an Giana Sisters, Lotus I und III, Monkey Island, Doom, Command & Conquer, Bioshock und viele mehr.

Aber kein Spiel spielte ich so oft und über einen so langen Zeitraum wie Minecraft. Teils vertrieben wir uns die Mittagspausen im Büro damit, aber auch die ein oder andere Session abends blieb nicht aus.

Minecraft

Seitdem ich Kinder habe, ist Minecraft ein ständiger Begleiter. Zuerst nur als Computerspiel, dann aber auch in Form von Büchern und Turnbeuteln, Klemmbausteinen und YouTube-Videos, begleitet es mich ständig.

Minecraft-Screenshot

Bei Minecraft handelt es sich um ein Computerspiel mit unglaublich vielen Facetten. Das Spiel existiert – gefühlt – für jegliches Gerät mit Eingabemöglichkeiten und einem Bildschirm. So läuft es auf Computern mit Windows, macOS und Linux (früher spielte ich es sogar auf FreeBSD, bis es dann wegen irgendeiner Bibliothek nicht mehr ging), aber auch mobile Geräte wie Android- und iOS-Tablets und -Handys werden unterstützt, genauso wie die handelsüblichen Konsolen. Minecraft kostet Geld, glücklicherweise einmalig pro Spieler und es wird kein Zwangsabo vorausgesetzt. Gegenwärtig kostet die Java-Edition, die auf Windows, macOS und Linux läuft, um die 24 Euro.

Die Spielwelt

Hat man das Spiel gekauft, heruntergeladen, installiert, gestartet und seinen Account eingetragen, kann es losgehen. Es gibt die Möglichkeit, das Spiel alleine zu spielen, einem Online-Server beizutreten, den man sich vielleicht im Internet mit ein paar anderen Spielern finanziert, auf einen Realm zu verbinden, die oft kostenpflichtig sind oder einen eigenen Server im Internet oder zu Hause zu betreiben. Ich, zum Beispiel, habe den kostenlosen Minecraft-Server in einem Jail auf FreeBSD laufen und er funktioniert einwandfrei.

Hat man sich für eine der Möglichkeiten entschieden und startet das richtige Spiel, so befindet man sich in einer schier unendlich großen Welt in der Egoperspektive. Unendlich ist die Welt zwar nicht, aber unglaublich groß. Mit der Maus sowie den Tasten [W], [A], [S] und [D] sowie einigen anderen bewegt man sich frei in dieser Welt umher. Die Welt besteht, in aller Regel, aus quadratischen Klötzen, die unterschiedliche Rohstoffe darstellen wie Holz und Stein, aber auch aus Tieren, Menschen und Monstern. Als Spieler hat man keine festen Vorgaben, was man machen muss und welche Ziele zu erreichen sind.

Es gibt verschiedene Modi, allen voran der Abenteuermodus sowie der Kreativmodus. Während im Abenteuermodus Monster jede Nacht auftauchen, die dem Spieler an den Kragen wollen, sind diese im Kreativmodus dem Spieler neutral eingestellt.

Im Kreativmodus hat man direkt alles im Inventar und kann genüsslich drauf losbauen oder die Welt erkunden. Dieser Modus bietet sich vor allem für die Kreativen oder für Kinder an. Im Abenteuermodus muss man alles selbst abbauen und sich vor den Monstern verteidigen.

Es gibt viel zu erkunden, sei es Dörfer zu finden und mit den Einwohnern Handel zu betreiben, Höhlen voller Monster und Schätze zu erkunden, Waldanwesen zu finden oder gegen Hexen zu kämpfen, die Möglichkeiten sind fast unbegrenzt. Selbst Zaubern und Jagen kann man genauso wie Angeln oder sich eine eigene Stadt bauen. Es gibt verschiedene Gebiete, Biome genannt. Da wäre zum Beispiel die Wüste, oder die Eisregion, die auch alle verschiedene Schätze beinhalten. Dungeons können durchforstet werden und lange Wege kann man über Schienen und Loren verkürzen.

Wäre das alles nicht genug, so kann der Spieler auch ein Portal in den Nether, eine Art Hölle, bauen und dort noch einiges mehr entdecken und gegen schlimme Kreaturen kämpfen. Oder er entdeckt das Portal zum Ende, wo der Enderdrachen auf einen wartet.

All dies kann man machen, wird aber nicht gezwungen.

Und wenn man möchte, kann man sogar direkt im Spiel programmieren. Es gibt Dinge wie Schaltkreise, mit denen man Automatismen bauen kann. Helligkeitssensoren, Schalter, Knöpfe, Leitungen und vieles mehr steht zur Verfügung.

Im Netzwerk

Vor geschätzt einem Jahr entdeckte mein Sohn Minecraft für sich. Er sah sich die Bücher an und ich zeigte ihm das Spiel. Seitdem spielen wir zwei oder drei Mal im Monat gemeinsam im Netzwerk im Kreativmodus. Wir bauen gemeinsam Häuser, Türme, Eisenbahnen, Portale und andere Dinge und haben in der Zeit eine Menge Spaß. Der Server ist kostenlos und läuft bei uns direkt auf einem Hardwareserver unter FreeBSD auf einem Jail.

Das Spiel fördert ungemein die Kreativität und bringt, neben dem Spaß, wenn wir spielen, auch einiges an Gesprächsstoff.

Empfehlung

Ich kann das Spiel absolut jedem Gelegenheitsspieler empfehlen, der keinen Druck möchte, sondern einfach ein wenig Entspannung sucht und vor allem gemeinsam mit Freunden oder Familie ist es ein toller Spaß für die kalten, regnerischen Tage.

wxWidgets auf Windows installieren

wxWidgets … neben Qt mein Lieblingsframework für die Entwicklung in C++. So installiert man es auf Windows:

wxWidgets-Website-Screenshot
wxWidgets-Website
  1. wxWidgets herunterladen: http://wxwidgets.org/downloads -> “Windows ZIP”
  2. Heruntergeladene Datei nach C:\wxWidgets entpacken
  3. tdm-gcc herunterladen: https://jmeubank.github.io/tdm-gcc/download
  4. tdm-gcc installieren (32bit- und 64bit-Variante, vollständige Installation, der Pfad zu den ausführbaren Dateien wird automatisch in die PATH-Variable eingetragen)
  5. CMD öffnen und nach C:\wxWidgets\build\msw wechseln
  6. Kompilieren:
    mingw32-make SHELL=CMD.exe -j4 -f makefile.gcc BUILD=release UNICODE=1 SHARED=0 MONOLITHIC=1

wxWidgets wird jetzt kompiliert und kann danach genutzt werden.

CDs vom Radiologen – Eine grobe Sicherheitsgefährdung?

Ich war beim Röntgen. Von dort bekommt man eine CD mit den Röntgenbildern mit, die man zum Arzt nimmt. Ich habe mir das mal kurz angesehen und war doch sehr erstaunt, dass darauf nicht nur die Röntgenbilder drauf sind.

CD vom Radiologen

Neben den Bildern auf der CD ist ebenfalls noch ein ausführbares Windowsprogramm drauf, welches die Bilder mehr oder weniger benutzerfreundlich anzeigen kann.

Tatsächlich wurde mir ein wenig mulmig, als mein Arzt die CD einfach in seinen Rechner schob, auf dem auch sein Arztinformationssystem lief. Er startete einfach das Programm und sah sich die Bilder an.

Muss das so sein? Wird in irgendeiner Weise abgefangen, wenn darauf irgendwas ist, was nicht sein sollte?

Schnell fallen mir zwei Szenarien ein:

  1. Wenn Viren oder andere Schadprogramme darauf sind
  2. Wenn der Patient, in böser Absicht, den Inhalt der CD ausgetauscht hat

Weiß vielleicht jemand mehr dazu? Letztlich empfinde ich das als extrem hohes Risiko.

Warum ich für neue Projekte eher Qt als wxWidgets nutze

Wir schreiben das Jahr 2005. Mein Arbeitgeber möchte eine neue Software erstellen und wir sind dafür auf der Suche, nach einer nahezu plattformunabhängigen GUI-Bibliothek.

Wir beginnen, mit Qt herumzuspielen und sind begeistert. Bis wir Lizenz und Preise sehen. Schweren Herzenz begaben wir uns auf die weitere Suche und stießen irgendwann, eigentlich recht schnell und ich weiß gar nicht mehr, warum, auf wxWidgets.

Ich spielte einige Stunden, nein Tage und dann auch Wochen, damit herum und war doch sehr angetan, schon alleine, da wxWidgets die GUI-Elemente (in der Regel) nicht selbst zeichnete, so wie es Qt wohl tat (und nicht mehr tut, wenn es nicht sein muss), sondern eine Abstraktion der nativen GUI-Bibliotheken war, die auf den Zielplattformen ohnehin zur Verfügung standen. Auf Windows also MFC, auf Linux/FreeBSD/ähnliche GTK, auf macOS zu der Zeit Carbon, mittlerweile Cocoa, und so weiter und so fort.

Die Programmierung verlangte aber eine höhere Einarbeitung ab, als Qt dies tat und viele Dinge mussten selbst implementiert werden, bsplw. Datenbankabstraktionsschichten mit Persistenzbibliotheken und vieles mehr. All das machte aber Spaß und wenn man es einmal hat – und natürlich auch richtig gemacht hat -, dann kann man es ja wieder verwenden.

So lief es und wir schrieben eine Software nach der anderen. GUI-Software, Systemsoftware, sogar etliche Websites und Backends schrieb ich mit wxWidgets und meinen eigenen Bibliotheken. Ich war schnell, effizient, glücklich.

Doch ich empfand es immer als anstrengend, wxWidgets auf anderen Plattformen als FreeBSD (oder manchmal auch Linux) zu benutzen. Auf FreeBSD reichte sowas wie “c++ *.cpp -o MeinProgramm `wx-config --libs --cppflags`”. Auf anderen Plattformen wie Windows und macOS war es halt kompliziert. Auf Windows mussste (und muss) man noch selbst gegen etliche Bibliotheken linken, auf macOS muss man das Bundling selbst schreiben und Bibliotheken bei der Auslieferung umbiegen. Nervig, ätzend.

Nachdem ich aber für kurze Zeit bei CGM anheuerte und die mit Qt einiges machten, setze ich mich, im Wissen darüber, dass die Lizenz nun liberaler geworden war, noch einmal ausgiebig damit auseinander. Mein Herz ging auf. Ich begann nicht nur, mich mit der Materie mehr zu beschäftigen, ich entwickelte die ersten Projekte darin.

Qt bringt für eltiche Systeme einen Installer mit und Programme und Scripts, die einem das Leben immens vereinfachen.

QtCreator

Es kommt eine komplette IDE, der QtCreator, mit, mit der man seine Programme entwickeln kann. Es wird ein GUI-Designer und vieles mehr mitgeliefert und auch das Deployment auf anderen Plattformen ist integriert und ein Kinderspiel.

Doch das ist nicht alles. Qt ist groß. Es deckt eine Menge ab. Von Netzwerkkommunikation über Datenbankhandling und GUI bis hin zur Entwicklung von Software für Android und iOS. Der (oftmals) selbe Code kompiliert unter allen Plattformen, so dass eine Crossplattformentwicklung relativ einfach (naja, nicht immer) möglich ist.

Aber was sagt die Lizenz? Bei wxWidgets ist es letztlich so: nimm und mach, erwähne uns. Bei Qt muss ich, wenn ich Änderungen am Qt-Code mache, diese auch freigeben. Eigene Software allerdings darf ich ohne Code herausgeben. Klingt das fair? Ja.

Noch eine Sache: Mit QML bringt Qt ein (weiteres) unglaublich mächtiges Werkzeug. Damit lassen sich die grafischen Oberflächen bis ins kleinste designen und anpassen, Abläufe definieren und Layouts für unterschiedliche Dinge entwerfen.

Die große Community hilft bei Problemen und es gibt einige Anwendungssoftware, die mit Qt umgesetzt ist.

Schaut es euch einmal an.

Umstieg von FreeBSD auf macOS

Zehn Jahre, nein, mehr als zehn Jahre, habe ich, nahezu ausschließlich, FreeBSD auf meinen Arbeitsplatzrechnern benutzt – auf der Arbeit, wie auch zu Hause.

Vor nunmehr einem Jahr bin ich gewechselt oder, besser gesagt, zurückgewechselt, auf macOS.

Ich liebe FreeBSD, wenn man denn bei einem Betriebssystem von Liebe sprechen kann. Es hat mir immer wahre Freude gemacht, mit dem System, neben meinen zahlreichen Servern und Jails, direkt meine Arbeit zu erledigen. Ungefähr 2009 bin ich in der Firma sowie zu Hause von macOS auf FreeBSD umgezogen, erledigte damit softwareentwicklerische und administrative Aufgaben, und ganz ehrlich: es gab nicht einen Tag, an dem ich aufgrund von Problemen nicht arbeiten konnte. Was ich brauchte, funktionierte in aller Regel gut bis sehr gut. Zuerst nutzte ich einige Jahre WindowMaker, stellte dann aber doch eines Tages, im Wahn des Komforts, auf KDE um und hatte ein hervorragendes Werkzeug, welches kaum Wünsche offen ließ.

Meine Werkzeugkiste war vollständig, doch irgendwann bröckelte es. Es begann mit Problemen meiner doch etwas in die Jahre gekommenen Grafikkarte. Dazu kamen dann die Zwänge, properitäre Software zu nutzen, vor der es mir immer noch schaudert. Weiterhin gab es für ein großes Projekt die Problematik, dass Qt mit meiner Webcam (und auch mit anderen) so überhaupt auf FreeBSD nicht klar kam und ich auch für Android und iOS entwickeln musste.

Schweren Herzens verabschiedete ich mich dann doch von FreeBSD auf der Workstation. Zu Windows, welches ich seit über zwanzig Jahren wie der Teufel das Weihwasser fürchte, wollte ich aber nicht. Da ich über all die Jahre auch immer ein MacBook hatte, welches aber nie mein Hauptsystem war, kam ich zur Überlegung, mir ein vernünftiges System vom Hersteller mit dem angebissenen Apfel zu kaufen. Es wurde das MacBook Pro 16″ aus 2019.

Bis auf den Dauervollausschlag des Lüfters bei angeschlossenen Bildschirmen bin ich sehr zufrieden. Das System bietet vieles, was mein FreeBSD für mich auch bot, und einiges andere mehr.

Auf meinen Servern betreibe ich FreeBSD aber wie gewohnt weiter und könnte glücklicher kaum sein. Selten hat mich ein System so wenig genervt und mich so wenig an Produktivität gehindert.

Aber trotz alle dem, steht meine FreeBSD-Workstation noch immer hier neben mir, mit seinem ZFS, dem RAID und allem, was ich so sehr mag. Ich habe XRDP drauf konfiguriert und nutze es ab und an doch noch für die ein oder andere Aufgabe.