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

Metin2 Client Source Compileren Handleiding (Visual Studio)

Het Metin2 client source compileren ziet er op het eerste gezicht intimiderend uit, maar als je het in de juiste volgorde aanpakt is het veel voorspelbaarder dan je zou verwachten. De Metin2 client source is een oudere C++-codebase; hij hangt af van een ruime verzameling externe libraries, en de meeste fouten komen niet voort uit de buildlogica zelf, maar uit verkeerd ingestelde paden, een incompatibele compilerversie of een ontbrekend .lib-bestand. In deze handleiding loop ik de stappen door om het clientproject (meestal het UserInterface-project) van begin tot eind te compileren met Visual Studio, de instellingen die ertoe doen, en de oplossingen voor de fouten die je het vaakst tegenkomt.

Voordat je begint: wat je nodig hebt

Een gezonde omgeving voor het Metin2 client source compileren vereist een paar kernonderdelen die je vooraf klaarzet. Weten voor welke compilerversie je sourcepakket is geschreven, elimineert meteen de helft van de problemen waar je anders later tegenaan zou lopen.

  • Visual Studio — Let op de versie waarop de source mikt. Oudere client-sources zijn meestal geschreven voor Visual Studio 2008/2010; ze kunnen ook gebouwd worden met een nieuwere Visual Studio (2017/2019/2022), maar dan moet je de platform toolset en SDK-instellingen aanpassen.
  • Externe libraries — De client hangt doorgaans af van Python (een ingebedde interpreter), DevIL (afbeeldingen laden), Granny (animatie/skinning), plus hulplibraries voor compressie en versleuteling. Hun versies moeten exact bij je sourcepakket passen; de verkeerde Python-versie kan je bijvoorbeeld uren kosten in de linkfase.
  • Vooraf gebouwde dependencies — De meeste sourcepakketten leveren de gebruikte libraries mee, ofwel als kant-en-klare .lib-bestanden, ofwel als aparte solutions. De veiligste weg is om eerst die sub-libraries te bouwen en daarna het clientproject.

De solution openen en de projectstructuur begrijpen

Wanneer je het sourcepakket uitpakt, vind je meestal een .sln-bestand (solution) met daarin meerdere projecten. Aan de clientkant is het hoofdproject waar het je om gaat het project dat de uiteindelijke executable (de gameclient) produceert, naast statische libraryprojecten zoals EterLib, GameLib en ScriptLib.

  • Als je de solution in Visual Studio opent, zal een solution in oud formaat een eenmalige conversie (upgrade) voorstellen. Een back-up van de source maken vóór het converteren is sterk aan te raden.
  • Controleer de volgorde van dependencies tussen de projecten (Build → Project Dependencies / Build Order). Statische libraries moeten vóór het hoofdproject gebouwd worden.
  • Kies de juiste actieve configuratie en het juiste platform. De client wordt klassiek gebouwd voor het doel Win32 (x86), niet x64. Je hebt ook de 32-bits builds van Python en de andere libraries nodig.

Platform toolset, SDK en de C++-standaard

Bij het compileren van een oude source met een moderne Visual Studio komen de meest kritieke instellingen hier samen. Kijk in de projecteigenschappen (Properties) naar het volgende:

  • Platform Toolset — Met Visual Studio 2019/2022 kun je de toolset v142/v143 kiezen; maar wil je incompatibiliteiten in oude code beperken, dan geeft het installeren en selecteren van een passende oudere toolset (bijv. v141) via de Build Tools minder verrassingen.
  • Windows SDK Version — Kies een SDK-versie die daadwerkelijk geïnstalleerd is. Fouten als "Cannot find Windows SDK" komen meestal doordat het project naar een SDK wijst die niet meer bestaat.
  • Character Set — Oudere Metin2-sources draaien meestal met de Multi-Byte Character Set. Unicode forceren kan compilatiefouten in stringfuncties opleveren.
  • Runtime Library — Zorg dat elk project (sub-libraries en het hoofdproject) dezelfde runtime gebruikt: voor Release moet /MT of /MD consistent zijn. Gemengde runtimes zijn de voornaamste oorzaak van LNK2005 "already defined"-fouten.

De include- en library-paden instellen

Om de compiler de headerbestanden en de linker de .lib-bestanden te laten vinden, moet je de paden correct definiëren. Dit per project instellen is netter dan het over de hele machine uit te smeren.

  • C/C++ → General → Additional Include Directories — Voeg hier de include-mappen van Python, DevIL, Granny en de andere libraries toe.
  • Linker → General → Additional Library Directories — Voeg de mappen toe met de .lib-bestanden van diezelfde libraries.
  • Linker → Input → Additional Dependencies — Som hier de benodigde .lib-namen op. Een ontbrekende invoer leidt rechtstreeks tot een LNK2019-fout (unresolved external symbol).
  • Schrijf de paden waar mogelijk relatief of met macro's (bijv. $(SolutionDir)); zo hoef je niet alles met de hand te corrigeren als je de source naar een andere map verplaatst.

Veelvoorkomende buildfouten en hun oplossingen

De meeste tijdrovende fouten bij het bouwen van de client zitten in de linkfase. Hier zijn typische voorbeelden en waar je moet kijken:

error LNK2019: unresolved external symbol ...
error LNK1104: cannot open file 'python27.lib'
error LNK2005: ... already defined in ...
  • LNK1104 (cannot open file) — De linker kan een .lib niet vinden. Controleer het Library Directories-pad en of het bestand er echt in die versie staat (bijv. de juiste Python-versie, de juiste 32/64-bits build).
  • LNK2019 (unresolved external symbol) — Meestal ontbreekt er een library in de lijst Additional Dependencies, of een van de statische libraries is niet gebouwd. Bouw eerst de sub-libraries.
  • LNK2005 (already defined) — Doorgaans veroorzaakt door een inconsistente Runtime Library-instelling of doordat hetzelfde symbool op twee plekken is gedefinieerd. Stem de runtime over alle projecten op elkaar af.
  • Compilerfouten (met C-prefix) — Fouten zoals C2065 of C2664 wijzen meestal op de verkeerde toolset/SDK of een Unicode/MBCS-conflict; bekijk eerst de character set en de include-paden.

Algemene regel: lees fouten altijd van boven naar beneden. De tientallen regels onder de eerste fout zijn vaak afgeleiden van dezelfde grondoorzaak; los de eerste regel op en de rest valt meestal vanzelf weg.

Veelgestelde vragen

Welke Visual Studio-versie moet ik gebruiken?

De veiligste weg is een toolset gebruiken die dicht bij de versie ligt waarvoor de source is geschreven. Hij kan ook gebouwd worden met een modern Visual Studio 2019/2022, maar dan moet je de platform toolset-, SDK- en character set-instellingen aanpassen. Loop je tegen problemen aan, dan lost het installeren van de passende oudere Build Tools de meeste incompatibiliteiten op.

Moet ik echt x86 (Win32) bouwen?

Klassieke Metin2 client-sources zijn ontworpen voor een 32-bits doel en verwachten de 32-bits builds van hun afhankelijke libraries (Python inbegrepen). Porten naar x64 is gevorderd werk; om te beginnen verloopt het met Win32 een stuk soepeler.

Waar en in welke versie moet ik de libraries halen?

Het gezondst is de versies te gebruiken die met je sourcepakket meekomen. Bij libraries als Python, DevIL en Granny is versiecompatibiliteit cruciaal; willekeurige actuele versies kunnen ABI-conflicten en linkfouten veroorzaken.

Vastgelopen op een LNK-fout? Heb je hulp nodig bij het compileren van de Metin2 client en server, source-aanpassingen of problemen aan de C++-kant, neem dan contact met me op — dan lossen we het samen op.

Devamı için