Prima compilare rar merge din prima. Pe ecran apar sute de rânduri, multe cu „error”, și pare că totul e stricat. De cele mai multe ori, însă, e **o singură** problemă, iar restul sunt urmări ale ei. Ca la o coadă de domino: contează prima piesă căzută. Lecția te învață s-o găsești și să recunoști cele mai dese mesaje.
Nivel: Avansat. Ce trebuie să știi înainte: lecțiile despre mediul de compilare, librării, game și, pentru partea de Windows, clientul în Visual Studio.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Eroare de compilare | Compilatorul nu înțelege un fișier .cpp sau .h. Mesajul conține error:. |
| Eroare de legare (link) | Toate fișierele s-au compilat, dar la lipire lipsește ceva. Mesajele conțin undefined reference sau LNK. |
Header (.h) | Fișier cu „declarații”, inclus în alte fișiere cu #include. |
| Simbol | Numele unei funcții sau variabile, așa cum îl vede legarea. |
| Avertisment (warning) | Un semnal, nu o oprire. Compilarea continuă. |
Pasul 1: Salvează tot și caută prima eroare
Pe FreeBSD, din folderul pe care îl compilezi:
gmake 2>&1 | tee /usr/home/build/build.log
grep -nEi "error|undefined reference|cannot find|not found" /usr/home/build/build.log | head -202>&1trimite și mesajele de eroare în același loc cu restul textului.teele arată pe ecran și le salvează.grep -nEicaută cuvintele-cheie, fără să conteze literele mari, și arată numărul rândului.head -20arată doar primele 20 de potriviri. Prima e cea importantă.
Deschide apoi build.log cu Notepad++ (prin WinSCP) și citește câteva rânduri înainte de prima eroare. Acolo scrie ce fișier se compila.
Pasul 2: Recunoaște tipul erorii
Erori pe FreeBSD (gmake, clang)
| Ce vezi | Ce înseamnă | Ce verifici |
|---|---|---|
clang++-devel: not found sau makedepend: not found | Lipsește o unealtă | Mediul de compilare, pasul 3 |
Need an operator sau alte erori de sintaxă în Makefile | Ai rulat make în loc de gmake | Rulează gmake |
fatal error: 'ceva.h' file not found | Lipsește un header | Calea din INCDIR, dacă există folderul, literele mari și mici din nume |
cannot find -lIL (sau alt -l...) | Lipsește o librărie la legare | Pachetul librăriei sau calea din LIBDIR |
undefined reference to ... | Un simbol nu a fost găsit la legare | Ai compilat toate librăriile? În ordine? Cu același compilator? |
incompatible with elf_i386 sau file in wrong format | Amesteci 32 și 64 de biți | file pe fișierele .o și .a; vezi mediul de compilare, pasul 4 |
mv: rename ../game to /usr/metin2/...: No such file or directory | Folderul din GAMEDIR nu există | Programul s-a compilat! E în game/. Schimbă GAMEDIR spre un folder care există |
python2.7: not found | Rețeta principală vrea Python 2.7 | În sursa verificată e un pas opțional (limit_time) |
warning: Clock skew detected | Ceasul sistemului e greșit | Corectează data serverului de test, apoi compilează curat |
error: unterminated #ifndef | Un fișier .h s-a salvat fără rândul gol de la final | Adaugă un Enter după ultimul #endif |
Erori în Visual Studio (client)
| Ce vezi | Ce înseamnă | Ce verifici |
|---|---|---|
C1083: Cannot open include file | Lipsește un header | Folderul extern, Include Directories din proprietățile proiectului |
LNK2019: unresolved external symbol | Lipsește o librărie la legare | Additional Dependencies, platforma (Win32), configurația |
LNK1104: cannot open file '...lib' | Fișierul .lib nu e găsit | Calea din Library Directories |
MSB8020: The build tools for ... cannot be found | Lipsește toolset-ul | Visual Studio Installer |
RC1015: cannot open include file 'afxres.h' | Lipsește MFC | Componenta C++ MFC |
Pasul 3: Repară doar cauza, apoi recompilează
- Schimbă un singur lucru (instalezi un pachet, corectezi o cale).
- Notează ce ai schimbat în jurnal.
- Compilează din nou și caută iar prima eroare.
Dacă după reparație apare altă eroare, e normal: ai trecut de prima piesă de domino. Dacă apare aceeași, reparația n-a atins cauza. Revino la ce aveai.
Trei capcane reale
Comentariile în coreeană. Multe fișiere vechi din sursă au comentarii în coreeană, salvate cu o codificare veche (în sursa verificată, de exemplu cmd_gm.cpp). Dacă editorul le salvează în UTF-8, apar semne �. De obicei compilarea merge, dar dacă stricăciunea atinge un text afișat în joc, mesajul se strică. În Notepad++, verifică codificarea în bara de jos înainte și după salvare și nu folosi conversii automate.
Schimbarea compilatorului. Dacă treci de la un compilator la altul (de exemplu de la g++ la clang++), pot apărea erori noi în cod care mergea, pentru că fiecare e strict la alte lucruri. Exemplu întâlnit: funcții vechi din C++ precum bind1st sau mem_fun, scoase din versiunile noi ale limbajului. Nu e o greșeală a ta, e o portare. Vezi portarea pe un FreeBSD modern.
Librăriile copiate „ca să meargă”. Unele tutoriale vechi spun să copiezi toate .a-urile în /usr/lib. Pare că rezolvă, dar nu mai știi ce ai schimbat, iar alte programe pot fi afectate. Repară calea în Makefile, nu sistemul.
Greșeli des întâlnite
- Citești ultima eroare, de la finalul textului. De obicei e doar o urmare.
- Schimbi zece lucruri deodată. Dacă merge, nu știi ce a ajutat; dacă nu, nu știi ce a stricat.
- Ascunzi erorile cu opțiuni care le transformă în avertismente. Problema rămâne, doar că apare mai târziu, la jucători.
- Cauți mesajul pe internet și copiezi prima soluție. Verifică întâi dacă se potrivește cu sursa și sistemul tău.
Întrebări frecvente
Avertismentele (warning) trebuie reparate?
Nu opresc compilarea. Sursa verificată chiar le ascunde cu -w. Când modifici cod, e bine totuși să le citești pentru fișierele tale.
De ce compilarea a mers ieri și azi nu?
Ceva s-a schimbat: o actualizare de pachete (pkg upgrade), ceasul sistemului, un fișier editat. Compară cu copia de ieri și uită-te în jurnal.
Ce trimit când cer ajutor?
Sistemul (uname -a), compilatorul (clang++ --version), comanda rulată și 20–30 de rânduri din jurul primei erori. Fără parole sau IP-uri reale.
Ce urmează
Ai un mediu care compilează curat. E momentul pentru prima modificare în sursa game. 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ă.