Compilarea separată în c

De aceea, un singur cod sursă nu poate determina ce fișiere necesită pentru a satisface dependențele. Trebuie să fie separat, manual, să specificați link-ul. Din acest motiv, au apărut sisteme de asamblare - sunt implicate în urmărirea actualizării fișierelor, recompilarea celor actualizate și comunicarea linker-ului care fișiere trebuie să facă legătura. Mai târziu, odată cu apariția IDE, a existat nevoia de a stoca informații despre interrelaționările fișierelor - așa că au apărut proiecte. De fapt, doar o listă de fișiere sursă pe care trebuie să le compilați și o legătură, precum și informații despre setările compilatorului / linkerului / IDE.







Caracterul extern este închis de cuvântul cheie extern. Mai exact, informează compilatorul că nu este necesar să căutați implementarea acestui simbol (sau să alocați un loc pentru el dacă este o variabilă). Funcțiile sunt implicite externe, deci nu este nevoie să specificați extern pentru ele.

Următorul lucru distractiv este reprezentat de mai multe implementări ale simbolurilor. Deoarece caracterul este determinat numai de nume propriu (spre deosebire de limbi modulare, ceea ce indică nu numai caracterul, dar, de asemenea, în cazul în care să-l) - atunci când linker-ul întâlnește mai multe dintre personaje similare, puse în aplicare în diferite fișiere, nu se poate determina care dintre ele este trimis la compilator și produce o eroare. De aici au apărut dansuri, oferind unicitate de nume - prefixe în C, namespaces în C ++.

Dar, în plus față de coincidența întâmplătoare a numelor de simboluri în fișiere diferite, există un alt motiv pentru această eroare - implementarea simbolului în fișierul antet. Dacă declarați o variabilă sau o funcție (complet, nu doar titlul acesteia) - aceasta va fi inclusă în toate fișierele în care este inclus acest fișier antet și, deoarece există o implementare, atunci toată lumea este implementată în ele. În plus, după ce am descoperit implementări ale mai multor simboluri cu același nume, linkerul va da o eroare. Prin urmare, fișierul antet este plasat numai variabile și-externe funcții anteturi (cu excepția funcțiilor inline - le apel la loc substituie compilator în sine, și, prin urmare, ar trebui să aibă punerea lor în aplicare la momentul compilarii). Chiar mai distractiv este dacă declarați o statică (static - la nivel global, dar este vizibilă numai în dosarul în care a declarat) variabila in zagolovochnike - totul compilează fără erori, dar fiecare obektnike va avea propria copie a variabilei nu este legată de celelalte, deși implica o variabilă globală . Ca rezultat, se ridică întrebarea: "De ce dacă încărc texturi în main.cpp, totul funcționează, dar dacă în alt.cpp - atunci texturile nu sunt încărcate?".







Aici. " Ceva de genul asta. Merită remarcat faptul că în C ++ acest mecanism este complicat și funcționează într-o oarecare măsură, dar nu sunt suficient cu aceste diferențe. Dar, în prima aproximare, funcționează similar.

P.S. Astept pentru rosii putrede de la neiver'a si alti cunoscatori ai lui C :)

Da, nimic de genul ăsta.
Exemplele nu sunt suficiente)

în general, este de dorit să continuăm despre zonele de vizibilitate și cu tot ce urmează ...
și, bineînțeles, ar trebui să existe exemple

Compactitatea limbajului C în combinație cu un număr mare de operatori face posibilă crearea unui cod de program, înțelegerea căruia este extrem de dificilă. Nimeni nu obligă programatorul să creeze programe neclare, dar toate posibilitățile pentru acest lucru sunt disponibile.
;)

cu # cea mai nuanțată compilație. și, în general, pentru cei care vor să învețe C de la zero cu tot ceea ce este discutat aici, mergeți la limba de programare: C, Kernighan, Ritchie. IMHO mai bine să înceapă să nu găsească.

Este? Din câte știu eu, din acest anacronism au refuzat și au folosit ceva asemănător unei compilații modulare. Se pare că nu există nici un antet, se conectează module .cs sau ansambluri întregi .dll. El, la urma urmei, nu este atât de mult cu Perl, ca și cu Java și Dolphi.

Și faptul că programul folosește această bibliotecă, va trebui să specificați link-ul separat ... linker-ul ar trebui să specifice fișierul obiect? prin urmare, cealaltă întrebare - face fișierul și fișierul antet aceleași nume?

Prin regulile unei forme bune - da, în general, nu neapărat.

... Și o altă întrebare: dacă fișierele se află în același folder ca și proiectul, trebuie încă să specificați link-ul?

Da. El nu le caută pe el însuși. Acesta leagă acele fișiere specificate. Dacă este specificat doar numele, acesta se află în directoarele sale de căutare. Fișierele obiect încă pot fi în arhivă - bibliotecă. Apoi trebuie să specificați linkerul ca o bibliotecă - pentru gcc acesta este -l gl.a. Din bibliotecă, el își va da seama ce fișiere includ (în general vorbind - totul, dar "legătura inteligentă" va arunca pe cele pe simbolurile cărora nu există legături).

Desigur, este necesar. Linkerul nu știe nimic despre proiectele tale, ci doar link-uri ce i se spune explicit, plus o bibliotecă standard.

Apropo, proiectul în sine este conceput pentru a stoca lista obiectelor și pentru a le hrăni cu link-ul. Toate fișierele care sunt incluse în proiect (bine, de obicei, acestea sunt filtrate prin extensie, astfel încât toate fișierele .c și .cpp în cadrul proiectului) vor fi compilate în ordine, și apoi transferat la linkerul.
Apropo, în asamblare exact același sistem. De aceea este destul de ușor să combinați cu C / C ++ - trebuie doar să citiți cum compilatorul implementează lucruri la nivel înalt, cum ar fi trecerea parametrilor către / de la o funcție. Cu excepția cazului în care simbolurile vizibile din exterior trebuie să fie declarate în mod special cu directiva GLOBAL (și aceasta depinde de asamblorul particular). Caracterele externe sunt aceleași EXTERN.

... adică, într-un cuvânt - prin înlocuirea tuturor denumirilor non-ponderate ale funcțiilor, variabilelor etc. Mein angajat în preprocesorul, care, la rândul său, bâjbâie numai acele fișiere care sunt specificate la linkerul, numai după ce funcția transliretsya zborki, Mein în asamblare și apoi Campiglio?
.c ->. o -> .asm -> .hex sau .exe - am reușit?







Articole similare

Trimiteți-le prietenilor: