Bullet unter Windows mit Visual C++




Verwendung als Source-Code
Verwendung der globalen Projektdatei



Zuerst wird das Bullet-Paket heruntergeladen:

bulletphysics.org/wordpress: bullet-2.80-rev2531.zip

und entpackt. Normalerweise wird man bei einer externen Library die vorkompilierten Dateien in sein eigenes Projekt einbinden oder - falls keine kompilierten Dateien vorliegen - versuchen, die Libraries irgendwie selbst zu kompilieren. Die Alternative besteht darin, die externen Sourcen direkt in das eigene Projekt aufzunehmen und zusammen mit den eigenen Quelltexten zu kompilieren. Dieses Verfahren soll hier als erstes vorgestellt werden.

Verwendung als Source-Code

Hierbei wird der Source-Code von Bullet unmittelbar im Projekt verwendet. Zuerst werden mit CMake die VCC-Projekte generiert, die dann in VCC zusammen mit dem Anwendungsprojekt in eine Projektmappe geladen und miteinander verlinkt werden. Das Verfahren ist in dem Artikel Creating a project from scratch beschrieben.

1. CMake-gui wird gestartet. Als Source-Ordner wird der Bullet-Ordner (z.B. bullet-2.80-rev2531) angegeben, nicht der Source-Ordner darin. Als Build-Ordner wird irgendein Ordner angegeben, am besten in Nähe des späteren Projektordners. Dann wird Configure (Generator Visual C++) gestartet; anschließend wird die Ausgabe überprüft. Der Library-Output-Path sollte stimmen und USE_MSVC_RUNTIME_LIBRARY_DLL aktiviert sein. Glut kann entfallen. Nun noch einmal Configure und dann Generate. Im angegebenen Build-Ordner stehen nun die VCC-Projekte, noch unkompiliert.

2. Nun wird in Visual C++ eine neues Projekt unter dem Namen des Anwendungsprogramms eingerichtet: Win32-Konsolen-Anwendung, ohne kompilierte Header. Ein Testlauf müsste ohne Probleme möglich sein.

3. Im nächsten Schritt werden werden die drei Bullet-Projekte BulletCollision.vcproj, BulletDynamics.vcproj und LinearMath.vcproj aus dem src-Ordner im Build-Order hinzugefügt, und zwar mittels <Datei/Hinzufügen/vorhandenes Projekt>. Damit tauchen in der Projektmappe neben dem Anwendungsprojekt drei weitere Projekte auf, die nun noch miteinander verlinkt werden müssen. Dazu Rechtsklick auf den Knoten des Anwendungsprojektes und dann <Projektabhängigkeiten>. Hier werden alle Felder aktiviert.

4. Der Compiler muss auf die Header in den Original-Sourcen zurückgreifen können, deshalb wird ein Include-Ordner hinzugefügt: Rechtsklick auf Projektknoten, dann <Eigenschaften/C++/Allgemein/Zusätzliche Include-Verzeichnisse>. Hier wird der SRC-Ordner aus dem entpackten Originalpaket hinzugefügt (z.B. bullet-2.80-rev2531/src). Dasselbe wird für alle Targets (Debug, Release ...) gemacht. Der Build-Prozess müsste für die entsprechenden Targets nun fehlerfrei durchlaufen.

5. Schließlich müssen noch die generierten Libraries verfügbar sein. Dazu werden die Projekteigenschaften aufgerufen, dann: <Allgemeine Eigenschaften/Framework und Verweise/neuen Verweis hinzufügen>. Hier werden nacheinander die drei Projekte hinzugefügt. Nun müsste alles durchlaufen.

Zum Test können folgende Zeilen addiert werden:

#include "btBulletDynamicsCommon.h"

und in main ():

btBoxShape *box = new btBoxShape (btVector3 (1,1,1));

Bullet ist eine umfangreiche Library mit einem enorm großen, verschachtelten Dateibaum. Visual C++ mit seinen eigenen Dateien bläht das Ganze noch weiter auf, so dass die Zusammenhänge relativ undurchsichtig bleiben. Eigene Projekte schleppen somit eine Vielzahl von Dateien und Ordnern mit. Evtl. kann das eine oder andere gekürzt werden, wobei die folgende Liste der Ordner u.U. hilfreich sein kann:

  • Bullet-Originalordner bullet-2.80-rev2531. Dieser Ordner wird nur CMake gebraucht, um den Build-Ordner zu erstellen.
  • Bullet-Original-Src-Ordner bullet-2.80-rev2531/src. Der Unterordner enthält die Header, so dass er im Projekt als Include-Ordner hinzugefügt werden muss.
  • Build-Src-Ordner bulletbuild/src. Hierin stecken die Bullet-Projektdateien für Visual C++, die dem eigenen Projekt hinzugefügt werden.
  • Build-Lib-Ordner bulletbuild/lib. Dieser Ordner schließlich enthält die Libraries.

Verwendung der globalen Projektdatei

Wesentlich einfacher und übersichtlich geht es, wenn man die Solution-Datei 0BulletSolution.sln im Unterordner \msvc nach Visual C++ lädt. Sowohl die Libraries als auch alle Beispiele werden kompiliert, und der Buildprozess läuft problemlos durch. Die Demos liegen danach im Hauptverzeichnis und können direkt gestartet werden; die Libraries sind im Unterordner \lib zu finden.

In der Voreinstellung werden die Debug-Dateien generiert. Alternativ oder ergänzend können auch die Release-Dateien generiert werden, nach entsprechender Umstellung im Kopf von VCC. Dann sollte mit den Release-Dateien begonnen werden; im umgekehrten Fall hat es bei mir einen Fehler gegeben. Im Falle der Debug-Version enthalten sowohl die Libraries als auch die Demo-Exes die Erweiterung _debug, z.B. BulletCollision_debug.lib.

Die Einbindung von Bullet in eigene Projekte ist nach diesem Verfahren relativ einfach. Zum Testen dienen wieder die beiden oben aufgeführten Codezeilen. In den Projekteigenschaften sind 3 Dinge zu erledigen:

  • Die Include-Verzeichnisse werden um den Bullet-Src-Ordner erweitert, denn hierin befinden sich alle Header.
  • Die Bibiliotheks-Verzeichnisse werden um den Bullet-Lib-Ordner erweitert.
  • Unter <Linker/Eingaben> werden die 3 Hauptlibraries aufgeführt: BulletCollision.lib, BulletDynamics.lib, LinearMath.lib.

Wenn der Linker meckert und z.B. mitteilt, er könne BulletCollision.obj nicht öffnen, dann wurde die Endung .lib ausgelassen. Es wird zwar nur ein Header eingebunden, doch dieser lädt im Hintergrund eine ganze Reihe weiterer Header nach. Das bedeutet auch, dass nicht nur auf BulletDynamics zugegriffen wird, so dass am besten alle relevanten Libs aufgeführt werden. Noch eines: Wenn das eigene Projekt als Debug-Version kompiliert werden soll, müssen die entsprchenden Debug-Libraries (mit Endung _debug) aufgelistet werden.

Im Vergleich mit dem oben beschriebenen Verfahren ist dieses wesentlich überschaubarer. Sowohl die Libraries als auch die Header lassen sich aus dem Bullet-Baum herauslösen und an dafür vorgesehenen Stellen unterbringen.