Inhaltsverzeichnis

Boost

Allgemeines

Auf der Suche nach einer plattformunabhängigen Lösung für diverse Probleme (z.B. Nutzung der seriellen Schnittstelle) bin ich bald auf Boost gestoßen.

Boost ist (theoretisch) plattformunabhängig und hat für die meisten Probleme, mit denen man als C++-Nutzer konfrontiert werden könnte, eine Lösung. So gibt es Libraries für Threading, IO, Speicherverwaltung, Algorithmen uvm. Boost versucht dabei, durch einen aufwendigen Prüfungsprozess eine hohe Qualität der einzelnen Teile zu gewährleisten. Deshalb und auch wegen seiner sehr permissiven Lizenz ist es weit verbreitet und wird zum Teil auch in C++-Standards aufgenommen (z.B. C++11).

Wie ich feststellen musste, ist die Dokumentation von Boost leider etwas schlecht was Verlinkung und ausführliche Erklärung angeht, sodass man einiges (mit Glück) erst findet, wenn man ein bisschen in einschlägigen Foren und Newsgroups sucht.

Installation

Nutzt man Boost unter Linux, so ist das meist nicht besonders schwierig, da wohl die meisten Distributionen entsprechende Pakete bereitstellen. Unter Windows funktioniert es auch - solange man MSVC verwendet. Leute wie ich - die, wo möglich, OSS einsetzen wollen - nutzen jedoch kein MSVC sondern MinGW - und da fangen die Probleme an. Installer sucht man mehr oder weniger erfolglos und wenn man sie findet, funktionieren sie häufig mit neuen Versionen von MinGW nicht mehr. Die einzige Lösung bleibt, Boost selbst zu kompilieren. Das ist zwar nicht immer nötig, da große Teile von Boost Header-Only sind und deshalb ein einfaches kopieren reicht. Trotzdem empfehle ich, alles zu kompilieren.

Das Vorgehen unter Windows/MinGW ist dann folgendermaßen:

Im Folgenden sollte auf jeden Fall cmd und nicht MSys oder ähnliches verwendet werden. Falls man unter Windows Vista oder 7 arbeitet, sollte man cmd als Admin starten.

Der Binary-Ordner von MinGW sollte in Path eingetragen sein. Das lässt sich einfach testen: cmd ausführen und g++ –version eingeben. Dann sollte etwas ähnliches rauskommen:

g++.exe (GCC) 4.6.2
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  1. Extrahieren und cmd in entsprechenden Verzeichnis starten
  2. Ausführen: bootstrap.bat gcc
  3. Ausführen: b2 install toolset=gcc –build-type=complete (das kann je nach Rechner mehrere Stunden dauern!)

Wenn das alles (hoffentlich fehlerfrei) durchgelaufen ist, existieren im Boost-Verzeichnis die Ordner include und lib. Zur Benennung der einzelnen Bibliotheken in lib gibt http://www.boost.org/doc/libs/1_48_0/more/getting_started/windows.html#library-naming aufschluss.

Nutzung

Möchte man nun mit Boost kompilieren und hat z.b. Boost 1.48 in c:\boost installiert, so muss der Compileraufruf etwa so aussehen (z.B. für die multithreaded Version der Libs):
cmd:
g++ myfiles.cpp -lsomething -lsomeboostlib-mt-1_48 -L c:\boost\lib -I c:\boost\include\boost-1_48 -o myboostapp.exe
bzw. für Msys:
g++ myfiles.cpp -lsomething -lsomeboostlib-mt-1_48 -Lc/boost/lib -Ic/boost/include/boost-1_48 -o myboostapp.exe

Unter Windows müssen häufig noch andere Libs hinzugelinkt werden, das muss dann anhand der Fehlermeldung entschieden werden. Z.B. benötigt die Serielle Kommunikation via Boost.ASIO noch ein -lwsock32, um folgende Fehler zu vermeiden:
…\AppData\Local\Temp\cc2kpzUp.o:main.cpp:(.text$_ZN5boost4asio6detail17winsock_init_base7startupERNS2_4dataEhh[boost::asio::detail::winsock_in base::startup(boost::asio::detail::winsock_init_base::data&, unsigned char, unsigned char)]+0x57): undefined reference to `WSAStartup@8'
…\AppData\Local\Temp\cc2kpzUp.o:main.cpp:(.text$_ZN5boost4asio6detail17winsock_init_base7cleanupERNS2_4dataE[boost::asio::detail::winsock_init se::cleanup(boost::asio::detail::winsock_init_base::data&)]+0x1e): undefined reference to `WSACleanup@0'
collect2: ld returned 1 exit status

Auch sollte nach Möglichkeit noch die Windowsversion definiert werden, z.B durch -D_WIN32_WINNT=0x0601 für Windows 7.