Inhalt
1. Einleitung
1.1. Links
2. BJam Kompilieren
3. Boost vorbereiten
4. Einrichten von Visual Studio
5. Die Testanwendung
6. Mitwirkende
1. Einleitung
Man hört es, man sucht es, man läds es runter, man versucht es einzubauen und schmeisst es wieder weg. Boost. Für alle die es nicht kennen: Boost ist eine Sammlung von Bibliotheken, manche davon sind im nächsten C++ Standard enthalten. Mit Boost kann man allerlei sachen machen, unter jedem System. Leider ist die Einrichtung von Boost nicht gerade Komfortabel, was auch mich einst dazu bewegt hat, aufzugeben und boost nicht zu benutzen. Ich werde in diesem Artikel beschreiben, wie man Boost mit Hilfe von BJam Kompiliert und in VC09 Express (ich denke, das ist die meistverwendete IDE, alternativ kann ich auch 05 Std anbieten) einrichtet. EIns noch vorneweg: Der Weg mit BJam ist nicht unbedingt der einfachste. Es gibt Installer für Boost, die erledigen diese Arbeit automatisch. Der Nachteil: Die gibts nur für Windows und sie sind nicht immer in der neuesten Version. Es kann also nicht schaden, sich das hier schnell durchzulesen, es ist wirklich nicht kompliziert. Wer sich dennoch für die Installer interessiert, ein Link kommt weiter unten.
1.1. Links
Bevor es los geht, noch einige Links, wo man Boost und BJam herbekommt (als Alternative kann man auch Google bemühen ;-))
Boost Download
Boost Jam (BJam) Download
Boost Installer (Achtung, nicht die neueste version verfügbar!)
Einrichtung des MingW Compilers für die automatische Kompilererkennung
Am besten nehmt ihr beide male das Zip-Archiv, das sollte am einfachsten gehen.
2. BJam Kompilieren
Entpackt zuerst BJam und wechselt in das entpackte Verzeichnis. Hier gibt es eine Datei build.bat - führt diese aus. Daraufhin wird BJam kompiliert, keine Sorge, es dauert nur ein paar Sekunden. Die entsprechende exe findet ihr im Ordner bin.ntx86. Unter Linux müsst ihr mit dem Befehl "sh ./build.sh" BJam erstellen. Fragt mich aber nicht, wo dann die ausführbare Datei landet.
Solltet ihr spezielle wünsche haben, mit welchem Compiler euer BJam erstellt wird oder sollte die Automatische Erkennung Probleme bereiten, gibt es die Möglichkeit, dies selber festzulegen. Solltet ihr bereits eine exe haben, ist es völlig ausreichend, diese zu verwenden und ihr könnt mit dem nächsten Abschnitt weiter machen.
Alle anderen müssen jetzt schonmal das cmd aufmachen und ins bjam verzeichnis wechseln (da wo die build.bat rumfliegt). Für eine Liste der unterstüzten Compiler und der weiteren Buildmöglichkeiten wechselt in den Ordner
jam und öffnet die Datei
building.html. Besorgt euch einen dieser Kompiler, sonst hilft euch dieser Artikel nicht weiter. Die build.bat erkennt automatisch, welchen Compiler ihr habt und benutzt i.d.r. den neuesten. Bei mir also Visual C++ 2008. Um die automatische Erkennung zu umgehen, reicht es, einen Parameter an die build.bat anzuhängen:
|
Quellcode
|
1
|
build.bat <compilerkürzel>
|
In der building.html erfahrt ihr, wie die entsprechenden Kürzel lauten, ich Liste mal die wichtigsten auf:
|
Quellcode
|
1
2
3
4
5
|
msvc - Visual C++ 6
vc7 - Visual C++ 2003
vc8 - Visual C++ 2005
vc9 - Visual C++ 2009
gcc - GNU gcc
|
Führt einfach die build.bat mit dem entsprechenden Parameter aus, z.b.:
|
Quellcode
|
1
2
|
build.bat vc7 // Kompiliert mit Visual C++ 2003
build.bat vc9 // Kompiliert mit Visual C++ 2008
|
In der Regel wird die Release Variante kompiliert, ihr könnt das umgehen, indem ihr --debug an die Komandozeile anhängt. Wie gesagt, es ist nicht erforderlich, daran etwas zu verändern, es sei denn, die automatische Erkennung macht Probleme. (Hey, es ist nur das BUILDTOOL
)
3. Boost vorbereiten
Jetzt komen wir zu dem wirklich wichtigen Teil.
Entpackt nun das Boost-Archiv. Holt euch die bjam.exe (die habt ihr ja vorher erstellt) und kopiert sie in euer entpacktes Boost. Nun öffnet die Konsole (Start->Ausführen->"cmd") und wechselt in das Verzeichnis, wo Boost liegt (mit dem Befehl cd).
Zuerst müsst ihr mal wissen, mit welchem Compiler ihr boost verwenden wollt. Für mich kommen zwei in Frage: Visual C++ 2008 und Visual C++ 2005 (Ob ihr express oder nicht habt, spielt keine Rolle). Dann müsst ihr wissen, ob ihr Debug oder Release braucht. Am besten nehmt ihr beides. Dll oder lib? Ich bevorzuge dll. Multithreaded oder nicht? Lasst davon besser die Finger und nehmt multithreaded.
So wir müssen nun bjam (aus der Konsole) anweisen, diesen ganzen Kram auch zu verwenden. Die Syntax sieht wie folgt aus:
|
Quellcode
|
1
|
bjam toolset=<compiler> variant=<debug/release> threading=<multi> link=<shared/static> [--with-<lib> --without-<lib>]
|
Der Parameter
toolset gibt den Compiler an. Mir ist folgendes Bekannt:
|
Quellcode
|
1
2
3
4
|
msvc-7.1
msvc-8.0
msvc-9.0
msvc-9.0express
|
Bei meiner Visual Studio 2008 Express Edition hat
msvc-9.0 problemlos funktioniert. Ich habe jedoch gehört, dass manche Leute
msvc-9.0express angeben mussten. Sollte also irgend etwas nicht funktionieren, versucht, noch das "express" dahinter zu hängen.
variant Gibt an, ob
debug oder
release Kompiliert werden soll.
Von threading lasst besser die Finger, multithreaded ist die beste Einstellung und ich wüsste keinen Grund, eine andere zu verwenden.
link gibt an, ob eine Dll erstellt werden soll oder alles in die exe reingelinkt wird. Da ich mit der Dll Version Probleme hatte, empfehle ich die Statische Lib-Linkung.
shared Erstellt Dlls + libs,
static erstellt statische libs.
--with- Kompiliert zusätzlich die angegebene Boost Library.
--with-filesystem würde z.B. noch das Filesystem hinzufügen.
--without- Die angegebene Lib wird nicht mitkompiliert.
Wird kein --with- angegeben, werden automatisch alle Libs kompiliert. Weenn with angegeben wird, wird nur die ausgewählte lib erstellt.
Um zum Beispiel die Debug und Release dlls mit Visual C++ 2008 zu erstellen gebt folgendes in die Konsole ein:
|
Quellcode
|
1
|
bjam toolset=msvc-9.0 variant=debug variant=release threading=multi link=static
|
Wenn man zum Beispiel nur das Threading System erstellen will, erweitert man die beiden Zeilen einfach noch um folgendes
--with-thread, das sähe dann so aus:
|
Quellcode
|
1
|
bjam toolset=msvc-9.0 variant=debug variant=release threading=multi link=static --with-thread
|
Dauert ein paar Sekunden.
Es kann durchaus sinnvoll sein, das ganze in einer Batch-Datei zu speichern, wenn z.b. eine neue Version von boost rauskommt muss man diese einfach nur noch ausführen. In meinem Fall sähe das so aus:
build.cmd
|
Quellcode
|
1
2
3
4
5
6
7
8
9
|
@echo off
echo Building with vc9...
bjam toolset=msvc-9.0 variant=debug variant=release threading=multi link=static
echo Building with vc8...
bjam toolset=msvc-8.0 variant=debug variant=release threading=multi link=static
pause
|
(Ms-Batch ist keine Kunst, jeder kann das lernen
)
Wer einfach alles erstellen will, kann auch folgendes machen:
|
Quellcode
|
1
|
bjam --build-type=complete
|
Dass das sehr lange dauert, brauche ich ja wohl nicht zu erwähnen.
Am effizientesten ist es, wenn man entweder nur die Lib erstellt, die man auch wirklich grade benötigt, oder man erstellt alle sinnvollen (also z.B. alle static debugs und releases), wenn man mal grade Essen geht. Wirklich alle zu erstellen macht keinen Sinn. Mein Vorschlag: Einfach erstmal drauf los coden. Beim Linken meckert der Compiler dann sofort, wenn ihm ne lib zum Linken felht. Der entsprechende Komponentenname ist im Dateiname enthalten. Erstellt die fehlenden Dateien dann einfach schnell mit dem --with-Parameter.
4. Einrichten von Visual Studio
Kommen wir dazu, wie man Visual Studio sagt, wo es boost finden kann.
Wie bekannt sein sollte brauchen wir einen Ordner, wo die Libs drin sind und einen für die Includes.
4.1. Die Libs vorbereiten
Zuerst müssen wir den Lib-Ordner vorbereiten. Geht dazu in den Unterordner
<boost>\bin.v2, diesen werden wir später in VS eintragen. Alle Libs (und eventuell Dlls) sind hier in den Unterordnern verteilt. Wir müssen sie nun da raus holen und in den bin.v2 Ordner kopieren, damit VS ihn findet. am besten in den bin.v2 Ordner kopieren. Diesen geben wir dann VS bekannt (beschreibe ich weiter unten nochmal).
Dazu sind mir spontan zwei Möglichkeiten eingefallen:
1) Als Testanwendung zu diesem Artikel habe ich ein kleines Programm geschrieben was die Aufgabe automatisch erledigt. Der Link ist weiter unten in der Section "Die Testanwendung".
1.1) Entpackt das Archiv und kopiert die exe (am besten die ohne D am Ende, das wäre nämlich die Debug Version) in euren bin.v2 Ordner.
1.2) Wenn das Ausführen nicht funktioniert, kopiert noch die Ordner mit den Runtime Libs dazu.
1.3) Exe Ausführen...
Wenn alles geklappt hat, habt ihr jetzt alle .lib und .dll Dateien in eurem bin.v2 Ordner.
Das ganze könnt ihr übrigens jederzeit wiederholen, wenn ihr z.B. eine weitere Komponente kompiliert habt oder etwa boost aktualisiert habt. Der Trick bei der Sache: Die Anwendung benutzt das boost-Filesystem für die nötigen Operationen. Um sie zu kompilieren müsst ihr mindestens die Komponenten filesystem und system in der Statischen Variante kompiliert haben und die entsprechenden Libs sollten sich in eurem bin.v2 oder einem anderen Ordner, den der Compiler kennt, befinden ;-)
2) Etwas komplizierter:
2.1) Startet die explorer suche (Strg+F).
2.2) Gebt bei Dateiname "*.lib" ein und startet die Suche.
2.3) Wenn die Suche beendet ist, markiert alle Ergebnisse (Strg+A) und kopiert diese (Strg+C).
2.4) Geht nun wieder in den bin.v2 Ordner und fügt die Dateien dort ein (Strg+V). Ihr werdet ein paar mal gefragt, ob ihr eine Datei überschreiben wollt, wählt jedes mal ja.
2.5) Wenn ihr die dll Versionen erstellt habt,
wiederholt (nicht etwa nur die Dlls kopieren) die Schritte 2-4 nur diesmal gebt ihr bei Suche "*.dll" ein.
Nun haben wir alle libs (und eventuell auch die dlls) in einem Verzeichnis.
4.2. Libs in Visual Studio bekanntgeben
Öffnet Visual Studio. Geht oben auf Extras->Optionen. Es öffnet sich ein neues Fenster. Im Tree links geht zu Projekte und Projektmappen->VC++ Verzeichnisse. Bei
Verzeichnisse anzeigen für wählt
Bibliotheksdateien aus. Fügt hier euer
bin.v2 Verzeichnis ein. Nun wählt noch
Includedateien aus. Hier gebt ihr euer Boost Verzeichnis an. Das wars.
5. Die Testanwendung
Nun muss nur noch alles getestet werden. Als Testanwendung habe ich mir folgendes ausgedacht: Wie oben bereits erwähnt, ist es ein Programm, was alle libs + dlls aus dem Unterverzeichniss "bin.v2/libs" nach "bin.v2" kopiert. Das ganze Verwendet boost::filesystem. Ich werde den Quellcode hier nicht hinschreiben, oder erklären, da es nur eine Testanwendung ist. Hier der Downloadlink zum gesamten Archiv:
ZIP-Archiv
RAR-Archiv (bessere Kompression)
Enthalten ist folgendes:
- Der Text dieser Artikels/Tutorials
- Quellcode zur Testanwendung
- VC 2008 Projekt und Projektmappe
- Vorkompilierte exe zur Debug und Release Version
Falls ihr unbedingt darauf besteht, die Dll zu verwenden (wie gesagt, ich hatte damit Runtimeprobleme), müsst ihr vor den Boost includes noch folgendes haben:
|
C-/C++-Quelltext
|
1
2
|
#define BOOST_ALL_DYN_LINK
#define BOOST_LIB_DIAGNOSTIC
|
6. Mitwirkende
Danke an alle die mir hierbei geholfen haben.
CodingCat, Danke für den CodeProject-Link
mirlix, Danke für die Unterstützung und deine Bemühungen
drakon, Danke, dass du mich auf die Installer aufmerksam gemacht hast
unsigned long, Danke für den Link zu den Installern
Das Gurke, Danke, dass du kurz erklärt hast, wie man MingW richtig einrichtet
mfg,
Faule Socke