aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Metin2 server source compileren op FreeBSD

Het compileren van de Metin2 server source is een van die taken die bijna iedereen de eerste keer in de war brengt: dat de code oorspronkelijk voor FreeBSD is geschreven lijkt een voordeel, maar zodra je C++ die voor een oude compiler is gemaakt naast moderne bibliotheken zet, stapelen de fouten zich op als een lawine. In deze gids deel ik de stappen die ik volg om de game- en db-bronnen netjes op FreeBSD te bouwen, samen met echte oplossingen voor de fouten die je het vaakst tegenkomt.

Waarom FreeBSD?

De serverkant van Metin2 is vanaf het begin ontworpen om op FreeBSD te draaien. De code is afhankelijk van het op kqueue gebaseerde netwerkmodel van FreeBSD en van specifieke systeemheaders. Compileren op Linux kan, maar vereist patches; als je doel een stabiele productieserver is, levert het identiek houden van de bouwomgeving aan de draaiomgeving de minste verrassingen op. In de praktijk kiezen de meesten een versie in het bereik FreeBSD 10–12: op zeer oude releases zijn de pakketrepository's niet meer bereikbaar, terwijl op zeer nieuwe clang de standaardcompiler is, wat extra incompatibiliteiten veroorzaakt.

De omgeving en afhankelijkheden voorbereiden

Voor je begint heeft het systeem de basis-ontwikkeltools nodig en de bibliotheken die de source verwacht. Op FreeBSD installeer je die met pkg:

pkg install gcc gmake scons
pkg install mysql57-client
pkg install cryptopp devil lzo2 boost-libs

Belangrijk punt: de meeste Metin2-bronnen zijn geschreven om met GCC te bouwen, niet met de standaard clang van het systeem. Je moet de compiler dus expliciet benoemen. De afhankelijkheden die de meeste problemen geven zijn:

  • MySQL-client: zonder libmysqlclient en de headers compileert het db-deel niet.
  • Crypto++ (cryptopp): de serverkey- en encryptieroutines hangen ervan af, en versieverschillen zijn een serieuze foutbron.
  • DevIL: sommige builds verwachten het voor beeld-/atlasverwerking.
  • Boost: nieuwere source-revisies hebben het soms nodig; oudere bouwen zonder boost.

Bouwvolgorde: eerst de bibliotheken, dan game en db

De Metin2-source is geen enkel project maar meerdere onderling afhankelijke statische bibliotheken plus twee hoofd-uitvoerbestanden. Om de afhankelijkheidsketen niet te breken moet je in de juiste volgorde bouwen. De gebruikelijke volgorde is:

libthecore  ->  basis-systeemabstracties
libpoly     ->  geometrie / botsing
libsql      ->  databaselaag (MySQL)
libgame     ->  gedeelde spellogica-code
libserverkey / equivalent
db          ->  databaseproces
game        ->  spelproces

Elke bibliotheek wordt in zijn eigen map gebouwd. De meeste bronnen leveren een Makefile; sommige gebruiken scons via een SConstruct-bestand. De veiligste manier om GCC af te dwingen is de compiler vast te leggen via omgevingsvariabelen:

cd Srcs/Server/libthecore/src
gmake -j2 CC=gcc CXX=g++

Bouw eerst alle lib*-mappen, ga dan naar db en game. Als je een proces probeert te bouwen vóór de bibliotheek waarvan het afhangt, stopt de linker met "undefined reference"-fouten.

De meest voorkomende fouten en hoe je ze oplost

De echte moeilijkheid is niet het compileren zelf, maar de punten waar oude code botst met moderne headers. Hier zijn de fouten die ik keer op keer zie:

  • "error: 'NULL' was not declared" of ontbrekende-type-fouten: meestal doordat een header (<cstring>, <cstdlib>) niet expliciet is ge-#included. Oude GCC trok die impliciet binnen; nieuwe versies niet. Voeg de ontbrekende header bovenaan het betreffende bronbestand toe.
  • cryptopp-linkfouten: "undefined reference" op symbolen als Integer of RSA. Dat betekent meestal dat de headers van de ene versie zijn en de gelinkte libcryptopp.a van een andere. Oplossing: het cryptopp-pad in de Makefile afstemmen op de werkelijk geïnstalleerde versie, of de cryptopp gebruiken die bij de source zit.
  • MySQL-header niet gevonden: mysql.h: No such file or directory. De Makefile verwacht vaak /usr/local/include/mysql; als pkg het ergens anders installeerde, corrigeer de -I-vlag. Het juiste pad vind je met mysql_config --include.
  • Het probeert met clang te bouwen: zie je onzinnige template-fouten, dan draait waarschijnlijk clang in plaats van GCC. Zorg dat je CXX=g++ hebt meegegeven.
  • 32-bit / 64-bit-mismatch: sommige oude bronnen zijn voor 32-bit geschreven. Krijg je waarschuwingen en crashes door verschillen in pointergrootte op 64-bit FreeBSD, dan is een naar 64-bit aangepaste revisie de schoonste optie; anders heb je een 32-bit toolchain via -m32 nodig.

Na de build: verificatie

Als je de db- en game-binaries hebt, is het werk nog niet klaar. Zelfs als de linker slaagde, duiken mismatches van dynamische bibliotheken pas tijdens runtime op. Voer deze controles uit:

file game db          # 64-bit of 32-bit, juiste architectuur?
ldd game              # ontbrekende gedeelde bibliotheken?

Als ldd "not found" zegt, is de bibliotheek niet geïnstalleerd of staat hij niet in je LD_LIBRARY_PATH. Zorg vóór het starten van de server dat het databaseschema is geladen en dat de poort- en padinstellingen in je conf.txt / CONFIG-bestanden kloppen. Het volgen van de syserr- en syslog-bestanden bij de eerste start laat je de meeste configuratiefouten binnen de eerste minuut opvangen.

Praktische tips

  • Stuur bouwlogs naar een bestand (gmake 2>&1 | tee build.log) — de eerste fout in de stapel vinden is veel waardevoller dan de honderden vervolgfouten onderaan.
  • Als je iets oplost, herbouw vanaf die bibliotheek in plaats van helemaal opnieuw; maar als je een header hebt gewijzigd, maak dan alles schoon wat ervan afhangt (gmake clean).
  • Als je een werkende compiler/bibliotheek-combinatie vindt, noteer de versies. Bij Metin2-bronnen is "waarmee het is gebouwd" de meest waardevolle informatie.

Veelgestelde vragen

Kan ik de Metin2-source ook op Linux compileren?

Ja, maar niet direct. Omdat de code afhankelijk is van FreeBSD-specifieke kqueue en systeemheaders, heeft Linux een epoll-aanpassing en diverse patches nodig. Draait je productieserver op FreeBSD, dan is bouwen op FreeBSD de weg met de minste problemen.

Welke FreeBSD- en GCC-versie moet ik gebruiken?

Er is geen enkele juiste versie; een toolchain die dicht bij het tijdperk van de source ligt geeft de minste fouten. In de praktijk werkt het bereik FreeBSD 10–12 met een via pkg geïnstalleerde GCC-versie goed. Het belangrijkste is bouwen met GCC in plaats van clang.

Hoe lees ik een "undefined reference"-fout?

Dit is een linkfout, geen compileerfout: de compiler begreep het bestand, maar de linker kon de body van de aangeroepen functie niet vinden. Meestal betekent het dat je een vereiste bibliotheek nog niet hebt gebouwd, of dat een -l-vlag/pad ontbreekt bij het linken. Controleer je bouwvolgorde en de bibliotheekpaden in de Makefile.

Wil je Metin2 server source maar niet compileren? Heb je hulp nodig bij een schone build, debuggen of serverinstallatie op FreeBSD, neem dan contact met me op — we werken een oplossing uit die past bij jouw source en omgeving.

Devamı için