Das Kompilieren der Metin2 Server Source ist eine jener Aufgaben, die fast jeden beim ersten Mal verwirren: Dass der Code ursprünglich für FreeBSD geschrieben wurde, wirkt wie ein Vorteil, doch sobald man C++ für einen alten Compiler neben moderne Bibliotheken setzt, türmen sich die Fehler lawinenartig auf. In dieser Anleitung teile ich die Schritte, mit denen ich die game- und db-Quellen sauber unter FreeBSD baue, samt echter Lösungen für die häufigsten Fehler.
Warum FreeBSD?
Die Serverseite von Metin2 wurde von Anfang an für den Betrieb unter FreeBSD entworfen. Der Code hängt vom kqueue-basierten Netzwerkmodell von FreeBSD und von bestimmten Systemheadern ab. Unter Linux zu kompilieren ist möglich, erfordert aber Patches; wenn dein Ziel ein stabiler Produktionsserver ist, bringt es die wenigsten Überraschungen, die Build-Umgebung identisch zur Laufzeitumgebung zu halten. In der Praxis wählen die meisten eine Version im Bereich FreeBSD 10–12: Bei sehr alten Releases sind die Paket-Repositories nicht mehr erreichbar, bei sehr neuen ist clang der Standardcompiler, was zusätzliche Inkompatibilitäten mit sich bringt.
Umgebung und Abhängigkeiten vorbereiten
Bevor du beginnst, braucht das System die grundlegenden Entwicklungswerkzeuge und die Bibliotheken, die die Source erwartet. Unter FreeBSD installierst du diese mit pkg:
pkg install gcc gmake scons
pkg install mysql57-client
pkg install cryptopp devil lzo2 boost-libs
Wichtiger Punkt: Die meisten Metin2-Quellen sind so geschrieben, dass sie mit GCC gebaut werden, nicht mit dem Standard-clang des Systems. Du musst den Compiler also explizit angeben. Die Abhängigkeiten, die am meisten Ärger machen, sind:
- MySQL-Client: ohne
libmysqlclientund die Header lässt sich derdb-Teil nicht kompilieren. - Crypto++ (cryptopp): die Serverkey- und Verschlüsselungsroutinen hängen davon ab, und Versionsunterschiede sind eine ernsthafte Fehlerquelle.
- DevIL: manche Builds erwarten es für die Bild-/Atlas-Verarbeitung.
- Boost: neuere Source-Revisionen benötigen es eventuell; ältere bauen ohne Boost.
Build-Reihenfolge: erst die Bibliotheken, dann game und db
Die Metin2-Source ist kein einzelnes Projekt, sondern mehrere voneinander abhängige statische Bibliotheken plus zwei Hauptprogramme. Um die Abhängigkeitskette nicht zu brechen, musst du in der richtigen Reihenfolge bauen. Die typische Reihenfolge ist:
libthecore -> grundlegende Systemabstraktionen
libpoly -> Geometrie / Kollision
libsql -> Datenbankschicht (MySQL)
libgame -> gemeinsamer Spiellogik-Code
libserverkey / Äquivalent
db -> Datenbankprozess
game -> Spielprozess
Jede Bibliothek wird in ihrem eigenen Verzeichnis gebaut. Die meisten Quellen liefern ein Makefile; einige nutzen scons über eine SConstruct-Datei. Der sicherste Weg, GCC zu erzwingen, ist, den Compiler per Umgebungsvariablen festzulegen:
cd Srcs/Server/libthecore/src
gmake -j2 CC=gcc CXX=g++
Baue zuerst alle lib*-Verzeichnisse, wechsle dann zu db und game. Wenn du einen Prozess vor der Bibliothek baust, von der er abhängt, bleibt der Linker mit "undefined reference"-Fehlern stehen.
Die häufigsten Fehler und ihre Lösungen
Die eigentliche Schwierigkeit ist nicht das Kompilieren selbst, sondern die Stellen, an denen alter Code mit modernen Headern kollidiert. Hier die Fehler, die ich immer wieder sehe:
- "error: 'NULL' was not declared" oder Fehler wegen fehlender Typen: meist verursacht durch einen Header (
<cstring>,<cstdlib>), der nicht explizit#included wurde. Altes GCC zog diese implizit herein, neue Versionen nicht. Füge den fehlenden Header oben in der betroffenen Quelldatei ein. - cryptopp-Linkfehler: "undefined reference" bei Symbolen wie
IntegeroderRSA. Das bedeutet meist, dass die Header von der einen Version und die gelinktelibcryptopp.avon einer anderen stammen. Lösung: den cryptopp-Pfad im Makefile an die tatsächlich installierte Version anpassen oder das mit der Source gelieferte cryptopp verwenden. - MySQL-Header nicht gefunden:
mysql.h: No such file or directory. Das Makefile erwartet oft/usr/local/include/mysql; hat pkg es woanders installiert, korrigiere das-I-Flag. Den richtigen Pfad findest du mitmysql_config --include. - Es versucht, mit clang zu bauen: Siehst du unsinnige Template-Fehler, läuft sehr wahrscheinlich clang statt GCC. Stelle sicher, dass du
CXX=g++übergeben hast. - 32-Bit-/64-Bit-Konflikt: Manche alten Quellen wurden für 32-Bit geschrieben. Treten unter 64-Bit-FreeBSD Warnungen und Abstürze durch unterschiedliche Zeigergrößen auf, ist eine an 64-Bit angepasste Revision die sauberste Option; sonst brauchst du eine 32-Bit-Toolchain via
-m32.
Nach dem Build: Überprüfung
Wenn du die db- und game-Binaries hast, ist die Arbeit noch nicht erledigt. Auch wenn der Linker durchlief, treten Inkompatibilitäten dynamischer Bibliotheken erst zur Laufzeit auf. Führe diese Prüfungen durch:
file game db # 64-Bit oder 32-Bit, richtige Architektur?
ldd game # fehlende gemeinsame Bibliotheken?
Sagt ldd "not found", ist die Bibliothek entweder nicht installiert oder nicht in deinem LD_LIBRARY_PATH. Stelle vor dem Start des Servers sicher, dass das Datenbankschema geladen ist und die Port- und Pfadeinstellungen in deinen conf.txt- / CONFIG-Dateien korrekt sind. Wer beim ersten Start die syserr- und syslog-Dateien beobachtet, fängt die meisten Konfigurationsfehler in der ersten Minute ab.
Praktische Tipps
- Leite Build-Logs in eine Datei um (
gmake 2>&1 | tee build.log) — den ersten Fehler im Stapel zu finden ist weit wertvoller als die Hunderte Folgefehler ganz unten. - Wenn du etwas korrigierst, baue ab dieser Bibliothek neu statt von Grund auf; hast du aber einen Header geändert, säubere alles, was davon abhängt (
gmake clean). - Findest du eine funktionierende Compiler-/Bibliothekskombination, notiere die Versionen. Bei Metin2-Quellen ist "womit es gebaut wurde" die wertvollste Information.
Häufige Fragen
Kann ich die Metin2-Source auch unter Linux kompilieren?
Ja, aber nicht direkt. Da der Code von FreeBSD-spezifischem kqueue und Systemheadern abhängt, braucht Linux eine epoll-Anpassung und diverse Patches. Läuft dein Produktionsserver unter FreeBSD, ist das Bauen unter FreeBSD der Weg mit den wenigsten Problemen.
Welche FreeBSD- und GCC-Version sollte ich verwenden?
Es gibt keine einzige richtige Version; eine Toolchain nahe der Entstehungszeit der Source erzeugt die wenigsten Fehler. In der Praxis funktioniert der Bereich FreeBSD 10–12 mit einer per pkg installierten GCC-Version gut. Wichtig ist, mit GCC statt mit clang zu bauen.
Wie lese ich einen "undefined reference"-Fehler?
Das ist ein Link- und kein Kompilierfehler: Der Compiler hat die Datei verstanden, aber der Linker konnte den Rumpf der aufgerufenen Funktion nicht finden. Meist heißt das, dass du eine benötigte Bibliothek noch nicht gebaut hast oder beim Linken ein -l-Flag/Pfad fehlt. Prüfe die Build-Reihenfolge und die Bibliothekspfade im Makefile.
Lässt sich deine Metin2 Server Source partout nicht kompilieren? Wenn du Hilfe bei einem sauberen Build, beim Debuggen oder bei der Servereinrichtung unter FreeBSD brauchst, nimm Kontakt mit mir auf — wir finden eine auf deine Source und Umgebung zugeschnittene Lösung.