Programele `game` și `db` nu se construiesc dintr-o bucată. Ele folosesc câteva **librării**, bucăți de cod comune, care trebuie compilate înaintea lor. E ca la o casă: întâi torni fundația și ridici zidurile, abia apoi pui acoperișul. Dacă sari peste o librărie, compilarea lui `game` se oprește cu erori greu de înțeles. Lecția îți arată ordinea și cum verifici fiecare pas.
Makefile-ul principal, compilezi librăriile cu gmake pe serverul de test, salvezi tot ce afișează compilarea într-un fișier și verifici că fiecare fișier .a a apărut și e pe arhitectura corectă.Nivel: Avansat. Ce trebuie să știi înainte: lecția despre mediul de compilare (uneltele instalate și GAMEDIR schimbat) și ce sunt game, db și sursa.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
Fișier .a | Librăria compilată, o „arhivă” de cod gata construit. De exemplu libthecore.a. |
Fișier .o | Rezultatul compilării unui singur fișier .cpp. Mai multe .o formează un .a. |
| Țintă (target) | Un nume din Makefile pe care îl dai lui gmake: gmake clean, gmake dep. |
gmake clean | Șterge rezultatele vechi, ca să compilezi de la zero. |
| Log de compilare | Tot textul afișat în timpul compilării, salvat într-un fișier ca să-l citești liniștit. |
Pasul 1: Află ordinea din rețeta principală
Nu copia ordinea de pe un forum. Citește-o din Makefile-ul din rădăcina sursei:
cd /usr/home/sursa
grep -n "^default" MakefileÎn sursa verificată de noi, rândul arată așa:
default: libthecore libpoly libgame liblua libsql libserverkey game dbAsta e ordinea: întâi cele 6 librării, apoi game și db. Pe scurt, ce face fiecare:
| Librărie | Rolul ei | Unde apare fișierul .a (sursa verificată) |
|---|---|---|
libthecore | Rețea, jurnale (log), timp, funcții de bază | libthecore/lib/libthecore.a |
libpoly | Calcule de geometrie | libpoly/libpoly.a |
libgame | Bucăți comune de logică | libgame/lib/libgame.a |
liblua | Limbajul Lua pentru questuri | liblua/lib/liblua.a și liblualib.a |
libsql | Legătura cu MySQL | libsql/libsql.a |
libserverkey | Verificarea cheii de server | libserverkey/libserverkey.a |
Pasul 2: Fă o copie înainte
Sursa vine deja cu librăriile compilate (fișierele .a). Compilarea le va șterge și le va construi din nou. Păstrează o copie a întregului folder, ca să ai mereu de unde reveni:
cp -Rp /usr/home/sursa /usr/home/sursa-copie-2026-11-02-R copiază tot folderul, -p păstrează datele și permisiunile fișierelor.
Pasul 3: Compilează librăriile una câte una
Poți rula gmake direct din rădăcină, dar pentru prima dată e mai clar să le faci pe rând. Pentru fiecare librărie, rețeta principală face patru lucruri: creează fișierul Depend, calculează dependențele, curăță, compilează. Repetăm exact asta. Exemplu pentru prima:
cd /usr/home/sursa/libthecore/src
touch Depend
gmake dep
gmake clean
gmake 2>&1 | tee /usr/home/build/libthecore.logExplicat bucată cu bucată:
touch Dependcreează un fișier gol numitDepend, dacă nu există.gmake depscrie în el legăturile dintre fișiere (foloseștemakedepend).gmake cleanșterge rezultatele vechi.gmake 2>&1 | tee ...compilează, îți arată textul pe ecran și îl salvează în fișierul.log.
Ce ar trebui să vezi: la final, rânduri cu ar cru ../lib/libthecore.a ... și ranlib, fără error.
Repetă pentru celelalte, în ordine, în folderele lor:
| Librărie | Folderul în care rulezi comenzile |
|---|---|
libpoly | /usr/home/sursa/libpoly |
libgame | /usr/home/sursa/libgame/src |
liblua | /usr/home/sursa/liblua (aici doar gmake clean și gmake, fără dep) |
libsql | /usr/home/sursa/libsql |
libserverkey | /usr/home/sursa/libserverkey |
Pasul 4: Verifică rezultatul
După toate, verifică că fișierele există și au data de azi:
cd /usr/home/sursa
ls -l libthecore/lib/libthecore.a libpoly/libpoly.a libgame/lib/libgame.a liblua/lib/liblua.a libsql/libsql.a libserverkey/libserverkey.aApoi verifică arhitectura pe un fișier .o:
file libthecore/src/socket.oCe ar trebui să vezi: ELF 32-bit LSB relocatable, Intel i386 pe un sistem de test i386. Dacă scrie 64-bit iar game-ul tău e pe 32 de biți, oprește-te: le-ai amestecat. Revezi pasul despre arhitectură din lecția anterioară.
Varianta rapidă: totul din rădăcină
Odată ce ai înțeles pașii, poți rula din rădăcina sursei:
cd /usr/home/sursa
gmake 2>&1 | tee /usr/home/build/build-tot.logDouă lucruri bune de știut despre Makefile-ul verificat de noi:
- Pentru
gameșidb, liniile care compilează efectiv sunt comentate (încep cu#). Rețeta principală doar pregătește folderele lor. Le compilezi separat, în lecțiile următoare. - Pasul
limit_timeruleazăpython2.7. Dacă nu ai Python 2.7, vei vedeapython2.7: not founddupă ce librăriile s-au compilat deja. Fișierullimit_time.hexistă deja în sursă, iar funcția legată de el e dezactivată, deci în sursa verificată poți trece peste. La tine, verifică.
Ce vezi și ce faci
| Ce vezi | Ce înseamnă | Ce faci |
|---|---|---|
clang++-devel: not found | Lipsește compilatorul cerut | Vezi mediul de compilare, pasul 3 |
Need an operator sau alte erori de sintaxă în Makefile | Ai folosit make în loc de gmake | Rulează cu gmake |
warning: overriding recipe for target 'libserverkey' | Ținta apare de două ori în Makefile | Doar un avertisment, nu oprește nimic |
fatal error: ... .h file not found | Lipsește un fișier de antet | Vezi erori de compilare |
Greșeli des întâlnite
- Sari peste o librărie sau schimbi ordinea.
gameva da apoiundefined reference. - Citești doar ultimul rând din log. Prima eroare e cea care contează.
- Copiezi
.a-uri de pe internet. Pot fi pe altă arhitectură sau din altă versiune a sursei. - Lucrezi fără copie. Dacă ceva se strică, nu mai ai librăriile originale.
Întrebări frecvente
Trebuie să recompilez librăriile de fiecare dată?
Nu. Doar când le schimbi codul sau când schimbi compilatorul ori flag-urile. Pentru o modificare doar în game/src, compilezi game.
Cât durează?
Librăriile, de obicei câteva minute. Depinde de procesor.
Ce înseamnă -j2 din alte tutoriale?
Îi spune lui gmake să compileze două fișiere în paralel. E mai rapid, dar erorile se amestecă în log. Pentru prima compilare, lasă-l deoparte.
Ce urmează
Librăriile sunt gata. Mergi la compilarea db. Toate lecțiile sunt în lista tutorialelor Metin2.
Server Metin2 gata de joc
Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.