La compilation des sources serveur Metin2 fait partie de ces tâches qui déroutent presque tout le monde la première fois : le fait que le code ait été écrit à l'origine pour FreeBSD semble un avantage, mais dès que vous placez du C++ conçu pour un vieux compilateur à côté de bibliothèques modernes, les erreurs s'accumulent en cascade. Dans ce guide, je partage les étapes que je suis pour construire proprement les sources game et db sous FreeBSD, ainsi que de vraies solutions aux erreurs les plus fréquentes.
Pourquoi FreeBSD ?
La partie serveur de Metin2 a été conçue dès le départ pour tourner sous FreeBSD. Le code dépend du modèle réseau basé sur kqueue de FreeBSD et de certains en-têtes système. Compiler sous Linux est possible mais demande des correctifs ; donc si votre objectif est un serveur de production stable, garder l'environnement de compilation identique à l'environnement d'exécution apporte le moins de surprises. En pratique, la plupart choisissent une version dans la plage FreeBSD 10–12 : sur des versions très anciennes les dépôts de paquets ne sont plus accessibles, tandis que sur les très récentes clang est le compilateur par défaut, ce qui ajoute des incompatibilités.
Préparer l'environnement et les dépendances
Avant de commencer, le système a besoin des outils de développement de base et des bibliothèques attendues par le code. Sous FreeBSD, on les installe avec pkg :
pkg install gcc gmake scons
pkg install mysql57-client
pkg install cryptopp devil lzo2 boost-libs
Point clé : la plupart des sources Metin2 sont écrites pour être compilées avec GCC, pas avec le clang par défaut du système. Vous devez donc nommer le compilateur explicitement. Les dépendances qui posent le plus de problèmes sont :
- Client MySQL : sans
libmysqlclientet ses en-têtes, la partiedbne compile pas. - Crypto++ (cryptopp) : la clé serveur et les routines de chiffrement en dépendent, et les différences de version sont une vraie source d'erreurs.
- DevIL : certains builds l'attendent pour le traitement des images/atlas.
- Boost : les révisions récentes peuvent l'exiger ; les anciennes se compilent sans boost.
Ordre de compilation : d'abord les bibliothèques, puis game et db
La source Metin2 n'est pas un projet unique mais plusieurs bibliothèques statiques interdépendantes plus deux exécutables principaux. Pour ne pas casser la chaîne de dépendances, il faut compiler dans le bon ordre. L'ordre typique est :
libthecore -> abstractions système de base
libpoly -> géométrie / collisions
libsql -> couche base de données (MySQL)
libgame -> code commun de la logique de jeu
libserverkey / équivalent
db -> processus base de données
game -> processus de jeu
Chaque bibliothèque se compile dans son propre répertoire. La plupart des sources fournissent un Makefile ; certaines utilisent scons via un fichier SConstruct. Le moyen le plus sûr de forcer GCC est de fixer le compilateur par variables d'environnement :
cd Srcs/Server/libthecore/src
gmake -j2 CC=gcc CXX=g++
Compilez d'abord tous les répertoires lib*, puis passez à db et game. Si vous essayez de construire un processus avant la bibliothèque dont il dépend, l'éditeur de liens s'arrête sur des erreurs « undefined reference ».
Les erreurs les plus fréquentes et leurs solutions
La vraie difficulté n'est pas la compilation elle-même, mais les points où l'ancien code entre en conflit avec les en-têtes modernes. Voici les erreurs que je rencontre encore et encore :
- « error: 'NULL' was not declared » ou erreurs de type manquant : généralement dues à un en-tête (
<cstring>,<cstdlib>) non#includeexplicitement. L'ancien GCC les tirait implicitement, les nouvelles versions non. Ajoutez l'en-tête manquant en haut du fichier concerné. - Erreurs de liaison cryptopp : « undefined reference » sur des symboles comme
IntegerouRSA. Cela signifie souvent que les en-têtes sont d'une version et lalibcryptopp.aliée d'une autre. Solution : aligner le chemin cryptopp du Makefile sur la version réellement installée, ou utiliser le cryptopp livré avec la source. - En-tête MySQL introuvable :
mysql.h: No such file or directory. Le Makefile attend souvent/usr/local/include/mysql; si pkg l'a installé ailleurs, corrigez le drapeau-I. Trouvez le bon chemin avecmysql_config --include. - Tentative de compilation avec clang : si vous voyez des erreurs de template absurdes, c'est très probablement clang qui s'exécute au lieu de GCC. Assurez-vous d'avoir passé
CXX=g++. - Incompatibilité 32 bits / 64 bits : certaines anciennes sources sont écrites pour le 32 bits. Si vous subissez des avertissements et des plantages liés à la taille des pointeurs sous FreeBSD 64 bits, l'option la plus saine est une révision adaptée au 64 bits ; sinon, il faut une chaîne d'outils 32 bits via
-m32.
Après le build : la vérification
Une fois les binaires db et game obtenus, le travail n'est pas terminé. Même si l'éditeur de liens est passé, les incompatibilités de bibliothèques dynamiques apparaissent à l'exécution. Effectuez ces vérifications :
file game db # 64 bits ou 32 bits, bonne architecture ?
ldd game # des bibliothèques partagées manquantes ?
Si ldd indique « not found », la bibliothèque n'est pas installée ou absente de votre LD_LIBRARY_PATH. Avant de démarrer le serveur, assurez-vous que le schéma de base de données est chargé et que les réglages de port et de chemin dans vos fichiers conf.txt / CONFIG sont corrects. Surveiller les fichiers syserr et syslog au premier lancement permet d'attraper la plupart des erreurs de configuration dès la première minute.
Conseils pratiques
- Redirigez les journaux de compilation vers un fichier (
gmake 2>&1 | tee build.log) — trouver la première erreur de la pile est bien plus utile que les centaines d'erreurs en cascade tout en bas. - Quand vous corrigez quelque chose, recompilez à partir de cette bibliothèque plutôt que de zéro ; mais si vous avez modifié un en-tête, nettoyez tout ce qui en dépend (
gmake clean). - Quand vous trouvez une combinaison compilateur/bibliothèque qui marche, notez les versions. Avec les sources Metin2, « avec quoi cela a été compilé » est l'information la plus précieuse.
Questions fréquentes
Puis-je aussi compiler la source Metin2 sous Linux ?
Oui, mais pas directement. Comme le code dépend du kqueue et des en-têtes système spécifiques à FreeBSD, Linux nécessite une adaptation epoll et divers correctifs. Si votre serveur de production tourne sous FreeBSD, compiler sous FreeBSD est la voie qui pose le moins de problèmes.
Quelle version de FreeBSD et de GCC utiliser ?
Il n'y a pas de version unique ; une chaîne d'outils proche de l'époque où la source a été écrite produit le moins d'erreurs. En pratique, la plage FreeBSD 10–12 avec une version de GCC installée depuis pkg fonctionne bien. L'essentiel est de compiler avec GCC plutôt qu'avec clang.
Comment lire une erreur « undefined reference » ?
C'est une erreur d'édition de liens, pas de compilation : le compilateur a compris le fichier, mais l'éditeur de liens n'a pas trouvé le corps de la fonction appelée. Cela signifie généralement que vous n'avez pas encore compilé une bibliothèque requise, ou qu'un drapeau/chemin -l manque lors de la liaison. Vérifiez l'ordre de compilation et les chemins de bibliothèques dans le Makefile.
Votre source serveur Metin2 refuse de compiler ? Si vous avez besoin d'aide pour un build propre, du débogage ou l'installation d'un serveur sous FreeBSD, contactez-moi — trouvons une solution adaptée à votre source et à votre environnement.