Greșeli de legătură - programul meu

Evaluare: 0/5

După compilarea fișierelor cpp în fișierele obj, programul Linker asamblează toate aceste fișiere într-un singur fișier executabil. Evident, la prima etapă de compilare (asamblarea fișierelor cpp în fișierele obj) și pe cea de-a doua pot apărea erori.





În prima etapă, ar trebui să înțelegem greșelile tipice. Luați în considerare erorile din faza de conectare. Se pare că există o mulțime de ele și vom lua în considerare doar câteva greșeli tipice.

1. Definirea variabilelor și funcțiilor în fișierele antet.







Să ne imaginăm că avem fișierul principal.cpp:

Mai departe în dosar există o implementare, dar nu este important pentru noi acum. Acum, ia în considerare fișierul lib.h

Am făcut o greșeală teribilă: ei au definit o variabilă și o funcție în ea. Ce se va întâmpla ca urmare a acestui fapt? Să vedem. În procesul de compilare, în loc de # include "lib.h", conținutul fișierului însuși va fi inserat. Putem folosi cu ușurință variabila i și funcția f în interiorul fișierului principal.cpp. Dacă putem folosi toate acestea fără fișierul lib.cpp, atunci de ce avem nevoie de fișierul lib.h? Răsplata va veni într-un moment în care vrem să creăm un al doilea fișier cpp în proiectul nostru. Să-i dăm și numele other.cpp

Aceasta este prima eroare clasică când lucrați cu fișiere antet.

Concluzie: în fișierele antet se află doar anteturile funcțiilor și referințele externe la variabile definite în afara

2. A anunțat, dar ați uitat să identificați.

Să presupunem că există un fișier main.cpp

În fișier lib.h vom descrie funcția de antet f, în timp ce în fișierul lib.cpp facem ceva, dar nu descriu punerea în aplicare a funcției f. Ce se va întâmpla? Compilatorul compilează main.cpp. În loc de #include "lib.h" inserează conținutul fișierului lib.h. El vede că funcția f a fost declarată anterior și compilează liniștit fișierul în main.obj. Apoi, compilează lib.cpp și primește lib.obj. Apoi linkerul sau linkerul va încerca să facă executabilul din aceste două fișiere. În acest proces, acesta va rezolva toate legăturile externe dintre fișiere. În acest caz, va încerca să rezolve relația dintre referința la funcția f și conținutul acesteia. Dar punerea sa în aplicare nu este. Prin urmare, va returna o eroare falsă: funcția f nu este definită nicăieri. Aceasta este o greșeală foarte ciudată. Toți compilatorii moderni rezolvă imediat această eroare.

3. Anunțate, dar definite diferit.

Din nou, vor fi fișierele main.cpp:

Fișierul principal.cpp este compilat fără probleme, deoarece fișierul lib.h spune că funcția f, care ia un întreg parametru și returnează o valoare intregă, este definită undeva. Compilatorul va crede acest lucru și va compila dosarul nostru. În plus, definim o funcție f într-un alt fișier cpp, doar uităm tipul său, pe care îl acceptă. În esență, am definit o altă funcție. Acest lucru este, de asemenea, compilat. Și după aceea linkerul începe să lucreze. Văzând descrierea funcției f care are un parametru întreg, ea începe să o caute în alte fișiere obj sau în același fișier. El găsește, dar cu un alt tip de sens acceptat. Nu găsim altă funcție f, produce o eroare de legătură: funcția f este definită diferit.

În nici o altă limbă nu veți găsi asemenea greșeli ciudate.

Acum, să ne uităm la avantajele acestui lucru în următoarea lecție.

  • Sunteți aici:
  • principal
  • Programare de formare
  • C ++
  • Erori de legare (aspect)






Trimiteți-le prietenilor: