Das Fangame Kompilieren
Diese Anleitung soll dabei helfen, eine Entwicklungsumgebung für das LoL4-Fangame einzurichten.
Sie bezieht sich auf Windows und Visual C++ Express 9 (2008), andere IDEs sollten
auch möglich sein (ein Anpassen der Projektdateien wäre aber notwendig). Andere Plattformen wurden bis jetzt noch nicht getestet.
- Das Game selbst
- Ogre
- OgreNewt
- ZLib
- TinyXML
- OpenAL
- libogg/libvorbis
- Qt
- QtOgre
- CEGUI
- Das Game Selbst
- Fehlerquellen
- Sonstige Hinweise
-
Das Game Selbst
Aus dem SVN den Quelltext des Fangames zunächst einmal nur auschecken. es bildet sich eine Ordnerstruktur wie|-landsoflore |-debug |-dependencies |-include |-lol4 |-lol4edit |-media |-release |-screenshots |-srcwichtig ist hier vA der dependencies-Ordner, da einige der nachfolgenden Komponenten dort hinein installiert werden müssen. -
Ogre
OgreSDK von http://www.ogre3d.org/ installieren- Installationsanleitung: http://www.ogre3d.org/wiki/index.php/Installing_An_SDK
Der Installer sollte automatisch die Umgebungsvariable OGRE_HOME anlegen. Außerdem sollte die Variable BOOST_HOME angelegt werden, die den Pfad der "mitgelieferten" Boost-Installation zeigt (Natürlich kann man auch eine andere Boost-Installation verwenden. Der Ordner befindet sich im OGRE_HOME und heißt möglicherweise boost_1_42. - VC++-Pfade Anpassen:
Include Files:- $(OGRE_HOME)\include\OGRE
- $(OGRE_HOME)\include\OGRE\Terrain
- $(BOOST_HOME)
- $(OGRE_HOME)\lib\release
- $(OGRE_HOME)\lib\debug
- $(BOOST_HOME)\lib
- Installationsanleitung: http://www.ogre3d.org/wiki/index.php/Installing_An_SDK
-
OgreNewt
OgreNewt installieren:- Newton 2 SDK installieren bzw entpacken: http://newtondynamics.com/forum/downloads.php
- Die Umgebungsvariable NEWTON_HOME anlegen, die den Installationspfad der Newton SDK enthält. (Der Ordner, indem sich die Ordner samples, sdk und toolchain befinden)
- Folgende Pfade in VC++ eintragen:
-
Include Files:
$(NEWTON_HOME)\sdk $(NEWTON_HOME)\sdk\dMath $(NEWTON_HOME)\sdk\dCustomJoints -
Library Files:
$(NEWTON_HOME)\sdk\x32 $(NEWTON_HOME)\sdk\x32\dll_vs9 - die o.g. Newton.dll sowohl in den Release- als auch in den Debug-Ordner im lol4-Verzeichnis kopieren
-
Include Files:
- OgreNewt muss aus dem SVN geholt werden. Erstellt in dem dependencies-Ordner einen Ordner 'OgreNewt' und checkt dorthin folgende
Repository aus:
https://svn.ogre3d.org/svnroot/ogreaddons/branches/ogrenewtEs sollte danach der Pfad dependencies\OgreNewt\newton20 existieren.
- Eventuell muss eine Kleinigkeit am OgreNewt-Code geändert werden. Die für das Terrain-System in Ogre 1.7 zuständige Klasse 'HeightField'
ist möglicherweise noch standardmäßig auskommentiert. Diese Teile müssen entkommentiert werden.
- ogrenewt\newton20\inc\OgreNewt_CollisionPrimitives.hetwa Zeile 452 bis 466, mit der Bemerkung 'Waiting for Ogre 1.7'
- ogrenewt\newton20\src\OgreNewt_CollisionPrimitives.cppZeile 783 bis 827
- ogrenewt\newton20\inc\OgreNewt_Prerequisites.hZeile 25 und 36, die beiden Vorkommen von # include <OgreTerrain.h> wieder einkommentieren
- In den Eigenschaften des Projekts unter Linker -> Input für Release 'OgreTerrain.lib' und unter Debug 'OgreTerrain_d.lib' eintragen.
- OgreNewt kompilieren: OgreNewt.sln öffnen und dann das Projekt OgreNewt in den Release und Debug-Modi kompilieren.
- Möglicher Fehler:
- c1xx : fatal error C1083: Cannot open source file: '.\inc': Permission denied
aus unerfindlichen Gründen funktioniert diese Pfadangabe nicht. In den Eigenschaften des Ogrenewt_Main-Projekts deshalb unter C/C++ für alle Konfigurationen ".\inc" in "inc" ändern.
- error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-ZmXXX' or greater
Tritt vermutlich nur bei DEBUG auf, nicht bei RELEASE. In den Eigenschaften des Projekts OgreNewt muss (für DEBUG) unter C/C++ -> Command Line unter Additional Options der empfohlene Parameter eingetragen werden
-
Das System kann die angegebene Datei nicht finden.
Die ganze Ausgabe sollte hier etwa so aussehen:1>Performing Post-Build Event... 1> 1 Datei(en) kopiert. 1> 1 Datei(en) kopiert. 1> 1 Datei(en) kopiert. 1> 1 Datei(en) kopiert. 1> 1 Datei(en) kopiert. 1> 1 Datei(en) kopiert. 1>Das System kann die angegebene Datei nicht finden. 1>Das System kann die angegebene Datei nicht finden. 1>Project : error PRJ0019: A tool returned an error code from "Performing Post-Build Event..."Das Post-Build-Event von OgreNewt versucht, das fertig kompilierte Zeug sowie die DLLs von Newton an alle möglichen Orte zu kopieren, zB in seinen Samples-Ordner oder in den von Ogre.
Eigentlich war das Kompilieren erfolgreich, auch wenn VC++ 'failed' sagt, die Ergebnisse liegen ganz normal unter newton20/lib. Wem es trotzdem stört kann das post-build-event auch raushauen, das sollte zu keinen Problemen führen.
- c1xx : fatal error C1083: Cannot open source file: '.\inc': Permission denied
Zlib/Minizip
- von http://www.zlib.net/ zLib 1.2.3 runterladen (etwa mitte der Seite, unter "The current release is publicly available here: ") und in den bereits vorhandenen zlib-ordner im dependencies extrahieren
- unter zlib\projects\visualc6 die zlib.dsw öffnen und dort von "zlib" die Modi LIB DEBUG und LIB RELEASE kompilieren.
- unter zlib\contrib\minizip die aus dem SVN stammende minizip.sln öffnen und im Debug- und im Release-Modus kompilieren
-
TinyXML
-
TinyXML runterladen und nach dependencies\tinyxml entpacken.
(in diesem Ordner müssen die ganzen Dateien enthalten sein, ohne Zwischenordner) - tinyxml.dsw öffnen (eventuelle Meldungen bezüglich Konvertierung oder Verwendung aktuellerer Dateien bejahen)
-
Nun muss am Projekt "tinyxmlSTD" eine Korrektur vorgenommen werden.
In den Eigenschaften unter "C/C++" -> "Code Generation" die Einstellung "Runtime Library" von "Multi-Threaded (/MT)" bzw "Multi-Threaded Debug (/MTd)" in "Multi-Threaded DLL (/MD)" bzw "Multi-Threaded Debug DLL (/MDd)" ändern. - In Debug und Release kompilieren.
-
TinyXML runterladen und nach dependencies\tinyxml entpacken.
OpenAL
- OpenAL SDK herunterladen: http://connect.creativelabs.com/developer/Wiki/OpenAL%20SDK%20for%20Windows.aspx und installieren.
Wenn der Installer nicht die Umgebungsvariable OPENAL_SDK nicht anlegt, muss dies manuell gemacht werden. Sie muss den Installationspfad enthalten, zB C:\Programme\OpenAL 1.1 SDK - Das Installationsverzeichnis in die VC++-Pfade eintragen:
Include Files:$(OPENAL_SDK)\includeLibrary Files:$(OPENAL_SDK)\libs\Win32
- OpenAL SDK herunterladen: http://connect.creativelabs.com/developer/Wiki/OpenAL%20SDK%20for%20Windows.aspx und installieren.
libogg und libvorbis
- beide von http://xiph.org/downloads/ herunterladen
- libogg:
- die ZIP sollte den Ordner "libogg-1.1.4" oder dergleichen enthalten. Diesen in den dependencies-Ordner extrahieren und einfach "ogg" nennen
- die Datei ogg\win32\VS2008\libogg_dynamic.sln öffnen und libogg in Debug und Release kompilieren
- libvorbis
- die ZIP sollte den Ordner "libvorbis-1.2.3" oder dergleichen enthalten. Diesen in den dependencies-Ordner extrahieren und einfach "vorbis" nennen
- die Datei vorbis\win32\VS2008\vorbis_dynamic.sln öffnen und libvorbisfile in debug und release kompilieren (libvorbis wird automatisch mitkompiliert)
- Siehe hier im Falle eines unresolved-external-Fehlers
- Mögliche Fehler:
- "vorbis.def : error LNK2001: unresolved external symbol _analysis_output_always
die Datei vorbis\win32\vorbis.def öffnen und die Zeile "_analysis_output_always" mit einem Strichpunkt auskommentieren (Zeile 51 bei mir)
- "vorbis.def : error LNK2001: unresolved external symbol _analysis_output_always
QT
- von http://qt.nokia.com/downloads die LGPL/Free -> Complete Development Environment Version herunterladen und installieren
- Anleitungen gibt es unter http://doc.trolltech.com/4.1/install-win.html oder http://rajorshi.net/blog/2009/01/using-qt-with-msvc-express-2008/ kurzfassung: mit dem VC++ Command Prompt in das QT-Verzeichnis wechseln (zB c:\Qt\2009.04\qt) und dort configure und nmake machen
-
Ob es in der Anleitung nun drinsteht oder nicht, die Umgebungsvariable QTDIR
muss angelegt werden, die den Installationspfad von Qt enthält, zB C:\Qt\2009.04\qt.
(unter Umständen muss das "\qt" am Ende weggelassen werden, je nachdem wohin es die fertig kompilierten binaries dann steckt. Siehe unter "Sonstige Fehler" für Details). -
VC++-Pfade anpassen:
- Include Files:
- $(QTDIR)\include\QtGui
- $(QTDIR)\include
- Include Files:
-
Mögliche Fehler:
-
QNetworkReplyHandler.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall WebCore::QNetworkReplyHandler::metaObject(void)const " (?metaObject@QNetworkReplyHandler@WebCore@@UBEPBUQMetaObject@@XZ)
oder dergleichen: das in Qt enthaltene Webkit macht Probleme. Wir brauchen es nicht, also kann man es rausschmeißen (cleanen und dann ohne webkit configuren)nmake confclean configure -no-webkit
-
api\qscriptextensionplugin.h(43): Error: Undefined interface
Es sind überflüssige temporäre Dateien im Qt-release enthalten. Es müssen zwei Dateien mit dem Namen mocinclude.tmp in den Ordnern X:\Qt\20xx.xx\qt\src\script\tmp\moc\debug_shared und .\release_shared gelöscht werden.
Danach noch einmal nmake.
-
QNetworkReplyHandler.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall WebCore::QNetworkReplyHandler::metaObject(void)const " (?metaObject@QNetworkReplyHandler@WebCore@@UBEPBUQMetaObject@@XZ)
QtOgre
QtOgre muss nun aus dem SVN geholt werden, und braucht danach noch das Tool cmake, dessen Bedienung in der Readme nur angedeutet ist...-
Erstellt im dependencies-Ordner den Order QtOgre, und checkt in diesen folgende Repository aus:
https://svn.ogre3d.org/svnroot/ogreaddons/trunk/QtOgreFramework(da drin entsteht nun noch ein Ordner mit dem Namen "QtOgre")
- Ladet euch das Tool cmake herunter (Windows (Win32 Installer)) und installiert es
- Startet CMake (cmake-gui). Unter "Where is the source code" gebt ihr den Pfad zum
Ordner QtOgre an, der sich in dem von euch erstellten befindet, also zB:
C:\ogre\projects\lol4\landsoflore\dependencies\QtOgre\QtOgreUnter "where to build" denselben Ordner, aber mit \bin am Ende (ja, "bin" ist in diesem Falle falsch, aber ich hatte keine Lust, es auszubessern), also zBC:\ogre\projects\lol4\landsoflore\dependencies\QtOgre\QtOgre\binDanach unten auf "Configure" (Frage, ob der Zielordner erstellt werden soll natürlich bejahen) und im nächsten Dialog euren Compiler/IDE auswählen, in diesem Fall Visual Studio 9 (2008) und "use default native compilers".
- Es wird danach einige Werte anzeigen, wie der Pfad zur qmake.exe, schaut nach ob sie stimmen. Für CMAKE_INSTALL_PREFIX schlägt es immer C:/Programme/QtOgreFramework vor, wir brauchen aber das gleiche, was auch bei "Where is the source code" steht.
- Nach dem Ausbessern nochmal auf Configure, und danach auf Generate. Unter QtOgre\QtOgre\bin sollte sich nun eine QtOgre.sln befinden. Öffnet sie, und kompiliert ALL_BUILD in Debug und Release.
- Achtung: nach einem Update von QT muss nicht nur QtOgre neu kompiliert werden, die QtOgre.sln muss auch mit den hier beschriebenen Schritten neu generiert werden.
-
Erstellt im dependencies-Ordner den Order QtOgre, und checkt in diesen folgende Repository aus:
-
CEGUI
CEGUI bietet zwar ein vorkompiliertes SDK an, dieses ist aber u.U. für eine veraltete Version von Ogre. (CEGUI 0.7.1 ist zB für Ogre 1.7.0 und wird mit 1.7.1 nicht funktionieren, beim starten von lol4game wird es zu einem Fehler wegen fehlenden Prozedureinsprungpunktes kommen.) Deshalb sollte man CEGUI selbst kompilieren.
Falls CEGUI gerade ein zum verwendeten Ogre kompatibles SDK anbietet, ist es ganz einfach:- Von http://www.cegui.org.uk/wiki/index.php/Downloads CEGUI 0.7.1 als Binary Download for Visual C++ herunterladen. Im dependencies-Ordner einen Ordner 'CEGUI' erstellen, und dorthin den Inhalt des Archivs extrahieren (unter dependencies\CEGUI müssen sich die Ordner bin, lib etc. befinden, ohne Ordner dazwischen).
- Von http://www.cegui.org.uk/wiki/index.php/Downloads
unter Library Source Downloads das Zip-Archiv und unter Binary Downloads for Microsoft Visual C++ 2008
die Precompiled External Libraries herunterladen.
Im dependencies-Ordner einen Ordner 'CEGUI' erstellen, und dorthin den Inhalt des Archivs extrahieren (unter dependencies\CEGUI müssen sich die Ordner bin, lib etc. befinden, ohne Ordner dazwischen). - Die Dependencies in den CEGUI-Ordner extrahieren, es bildet sich dann der Ordner dependencies\CEGUI\dependencies
-
Unter CEGUI\projects\premake die config.lua anpassen (eventuell die README konsultieren)
Vor Allem die OGRE_PATHS werden sehr warscheinlich falsch sein, include_suffix muss include/OGRE heißen.
Desweiteren OGRE_RENDERER auf true setzen. - Achtung: DEFAULT_IMAGE_CODEC steht standardmäßig auf "silly", und darauf ist das Projekt (bzw in erster Linie die dllcopy.bat) ausgelegt. Sollte ein anderer Codec verwendet werden, müssen entsprechende DLLs aus CEGUI/bin und CEGUI/dependencies/bin kopiert werden!
- Wenn das soweit stimmt, die build_vs2008.bat (oder die der VC+-Version entsprechende) ausführen.
- Die neu entstandene CEGUI.sln öffnen und die Solution in Debug und Release kompilieren.
-
Das Game selbst
- Zunächst einmal sollte die Datei dllcopy.bat im lol4-Ordner ausgeführt werden. Diese sollte, wie der Name schon sagt, alle notwendigen DLLs dorthin kopieren wo sie benötigt werden. Kontrolliert auch die Ausgabe der Batchdatei, "1 Datei(en) Kopiert" ist ein gutes Zeichen, "Das System kann die angegebene Datei nicht finden." eher weniger. Das Script bricht auch ab, falls die notwendigen Umgebungsvariablen nicht existieren oder notwendige Pfade nicht vorhanden sind.
- Jetzt solltet ihr die lol4.sln öffnen und das Fangame kompilieren können. Falls nicht, siehe den Abschnitt "Sonstige Fehlerquellen"
-
Sonstige Fehlerquellen
- "Ogre.h nicht gefunden":$(OGRE_HOME)\inc wurde nicht in die "Include Files"-pfade eingetragen
- "Newton.h nicht gefunden":
$(NEWTON_HOME)\sdk wurde nicht in die "Include Files"-pfade eingetragen oder die Umgebungsvariable NEWTON_HOME stimmt nicht
- "winres.h nicht gefunden":
warscheinlich fehlt das Microsoft Platform SDK. Zwar steht im Ogre-Wiki das nur als Hinweis für VC++ 8, aber man braucht es wohl auch für VC++ 9.
- Microsoft Platform SDK for Windows Server 2003 R2 Herunterladen und installieren. Den Installationspfad merken.
- In VC++ muss nun unter Include Files der Installationspfad des PSDK + "Include\mfc" eingetragen werden, also zB
C:\Programme\Microsoft Platform SDK for Windows Server 2003 R2\Include\mfc
- Der Befehl "C:\Qt\2009.04\bin\moc" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
oder
QtGui4.lib konnte nicht gefunden werden
oder
ganz viele qt-relevante .h-Dateien nicht gefunden
oder dergleichen.Ich bin mir nicht ganz sicher, wieso genau, aber anscheinend können nach dem Kompilieren von Qt die ganzen Dateien entweder unter X:\Qt\20xx.xx oder aber unter X:\Qt\20xx.xx\qt landen. Sollte das zweite der Fall sein, muss die Umgebungsvariable QTDIR auf X:\Qt\20xx.xx\qt gesetzt werden und nicht auf X:\Qt\20xx.xx. -
Could not load dynamic library .\RenderSystem_Direct3D9_d. System Error: Das angegebene Modul wurde nicht gefunden.
oder
d3d9x_XX.dll wurde nicht gefunden
oder ähnlicher DirectX-bezogener Fehler.Es gibt mehrere Ausgaben derselben DirectX-Version (die an einem best. Monat erschienen ist), für das DirectX9-Rendersystem von Ogre gibt es eine Version, die es mindestens braucht. Die momentane Mindestversion für Ogre 1.7.1 ist die von August 2009 - Der Prozedureinsprungpunkt "?allocateBytes@NedAllocPolicy@Ogre@@SAPAXIPBDH0@Z" wurde in der DLL "OgreMain(_d).dll" nicht gefunden.
Falls ein vorkompiliertes CEGUI-SDK verwendet wurde, ist dies das Zeichen, dass es zur aktuellen Ogre-Version inkompatibel ist. CEGUI muss manuell kompiliert werden.
- Microsoft C++ exception: CEGUI::GenericException at memory location 0x001293fc..
Vermutlich fehlt eine für CEGUI wichtige DLL. Es sollte im CEGUI.log nachgesehen werden, was genau. Wenn man einen anderen Imagecodec verwendet, müssen auch die entsprechenden DLLs in die Release- und Debugordner kopiert werden. Eine Möglichkeit ist:DynamicModule::DynamicModule - Failed to load module 'CEGUISILLYImageCodec_d': Unknown Error
-
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: (...) already defined in tinyxmld_STL.lib(tinyxml.obj)
(sehr viele Fehler dieser Art)Dies ist ein Problem mit TinyXML, um das zu beheben, muss am Projekt "tinyxmlSTD" eine Korrektur vorgenommen werden. In den Eigenschaften unter "C/C++" -> "Code Generation" die Einstellung "Runtime Library" von "Multi-Threaded (/MT)" bzw "Multi-Threaded Debug (/MTd)" in "Multi-Threaded DLL (/MD)" bzw "Multi-Threaded Debug DLL (/MDd)" ändern.
- "Ogre.h nicht gefunden":
-
Sonstige Hinweise
-
VC++-Pfade:
unter Tools -> Options -> Projects and Solutions -> VC++ Directories.
Manchmal muss VC++ danach neu gestartet werden, um diese Änderungen auch zu bemerken. -
Allgemeines zu Pfaden in VC++:
sämtliche Pfadangaben in VC++ müssen den Backslash \ verwenden, nicht den "normalen" Slash ⁄. Ansonsten wird der Pfad ignoriert.
-
VC++-Pfade:
