Capitolul 3. BIBLIOTECA
3.1. Introducere în Biblioteca
După cum a fost menționat în capitolul precedent, biblioteca - un set aranjate într-un mod special fișierele obiect. Bibliotecile sunt conectate la programul principal la momentul conectării. Prin conectarea bibliotecii metoda împărțită în fișiere (biblioteci statice, biblioteci statice) și partajate (bibliotecile partajate, bibliotecile partajate). Pe Linux, în plus, există mecanisme pentru biblioteci preluați dinamic. Esența podgruzki dinamică este faptul că programul de funcționare are libertatea de a se conecta să se gândească la orice bibliotecă. Cu această capacitate, de a crea programe cu plug-in-uri. cum ar fi XMMS. În acest capitol, nu vom acoperi preluați dinamic și se va opri pe utilizarea clasică a bibliotecilor statice și dinamice.
Din punctul de vedere al modelului ICC biblioteca - acest server. Bibliotecile transporta un punct important: capacitatea de a utiliza aceleași mecanisme în diferite programe. În Linux, biblioteca folosit peste tot, pentru că este un mod foarte convenabil de a „nu reinventeze roata.“ Chiar și Linux kernel într-un anumit sens este o bibliotecă numit mecanismul de apel de sistem.
Biblioteca static - este doar o arhivă de fișiere obiect, care este conectat la programul în momentul conectării. Efectul este același ca și în cazul în care vă conectați fiecare dintre fișierele separat.
În Linux, biblioteci statice au, în general, o extensie .O (Arhiva) și bibliotecile partajate au extensia .so (Shared Object). Bibliotecile, de obicei în directoare / lib și / usr / lib. În cazul unui alt aranjament (se aplică numai pentru bibliotecile partajate) au puțin „podshamanit“ pentru a rula programul.
3.2. bibliotecă statică EXEMPLU
Acum, să creați propria bibliotecă are două funcții: h_world () și g_world (), care afișează „Hello World“ și „La revedere World“, respectiv. Să începem cu biblioteca statica.
Să începem cu interfața. World.h a crea un fișier: Ați anunțat doar caracteristicile care vor fi utilizate.
Acum este necesar să se pună în aplicare server. H_world.c a crea un fișier: Acum creați fișierul g_world.c care conține g_world de punere în aplicare () Funcția: Ar putea fi la fel de bine pentru a se potrivi ambele funcții într-un singur fișier (hello.c, de exemplu), dar pentru claritate, am efectuat codul în două fișiere .
Acum, creați un fișier main.c. Este clientul care va utiliza serviciile serverului:
Acum scrie un script pentru a face. Pentru a face acest lucru, creați un Makefile: Nu uitați să puneți fila în fața fiecărei reguli în obligațiuni țintă.
Rămâne doar pentru a verifica dacă funcționează programul, și de a înțelege ceea ce am făcut este:
Deci, în acest exemplu, există trei lucruri noi: -l și compilatorul -L, precum și comanda ar. Să începem cu acesta din urmă. După cum probabil ați ghicit, comanda ar crea o bibliotecă statică (arhivă). În acest caz, cele două fișiere obiect împreună într-un singur fișier libworld.a. Sub Linux, practic toate bibliotecile sunt prefixate cu lib.
După cum sa menționat deja, compilatorul gcc în sine determină linker-ul atunci când este nevoie. opțiunea -l, a trecut la compilator, linker procesat și transmis cel conectat la biblioteca binară. După cum puteți vedea, numele bibliotecii „tăiat“ prefix și sufix. Acest lucru se face în scopul de a crea o „aparentă indiferență“ între biblioteci statice și dinamice. Dar acest lucru va fi discutat în alte capitole. Acum este important să se știe este faptul că o bibliotecă și o bibliotecă libfoo.so libfoo.a conectat la opțiunea de proiect -lfoo. În cazul nostru libworld.a „tăiat în jos“ pentru a -lworld.
Opțiunea -L specifică linker-ul unde să caute biblioteca. În cazul în care biblioteca se află în / lib sau / usr / lib, atunci întrebarea nu mai este relevantă și opțiunea -L nu este necesară. În acest caz, biblioteca este magazia (directorul curent). În mod implicit, linkerul nu revizuiește directorul curent la căutare bibliotecă, opțiunea atât -L. (Dot înseamnă directorul curent) este necesară.
3.3. EXEMPLU bibliotecă partajată
Pentru a crea și utiliza o bibliotecă dinamică (partajat), suficient pentru a modifica proiectul nostru Makefile.
Aparent, nimic nu sa schimbat: programul este compilat, a alerga și de a efectua aceiași pași ca și în cazul precedent. Am schimbat esența interioară. care joacă un rol primordial pentru programator. Luați în considerare totul în ordine.
Regula de asamblare binar include acum o opțiune înfricoșătoare -Wl, -rpath,. E în regulă, nu aici. După cum sa afirmat în repetate rânduri, compilatorul gcc în sine determină ld de legătură, atunci când este necesar și trece opțiunile dorite construi, care ne scutește de inutilă bandă roșie platformă dependente. Dar, uneori, tot trebuie să intervină în acest proces și să transmită linker opțiunea „lor“. Pentru a face acest lucru, utilizați opțiunea -Wl compilator, opțiune, optargs. I transcrie: opțiune trecere linkerul opțiunea (-Wl) cu argumente optargs. În cazul nostru, vom trece argumentul opțiunea -rpath linker. (Point, directorul curent). Se pune întrebarea: ce este opțiunea -rpath? După cum sa menționat deja, căutările linker pentru bibliotecile din anumite locații; de obicei, directoare / lib și / usr / lib, uneori / usr / local / lib. Opțiunea -rpath pur și simplu adaugă la această listă un alt catalog. În cazul nostru, este directorul curent. Fără -rpath opțiune, linker-ul „tăcerea“ va reuni programul, dar atunci când începeți va trebui să aștepte o surpriză: programul nu va porni din cauza lipsei de bibliotecă. Încercați să eliminați opțiunea -Wl, -rpath. în Makefile și reconstrui proiectul. Când încercați să executați programul binar este completat cu un cod de retur 127 (privind codurile de returnare vor fi discutate în capitolele următoare). Același lucru se întâmplă dacă apelați un program dintr-un alt director. Întoarcere înapoi -Wl, -rpath. reconstrui proiectul, du-te până la un nivel superior folosind comanda cd. și să încerce să rulați binar lume / comanda binar. Acesta nu va funcționa, deoarece acest nou catalog de bibliotecă nr.
Există o modalitate de a nu transfera opțiuni suplimentare de legare cu ajutorul -Wl - este de a utiliza mediul LD_LIBRARY_PATH variabila. În capitolele următoare, vom aborda teme de mediu în profunzime (mediu). Acum, voi spune doar că fiecare utilizator are un așa-numitul mediu (mediu) este un set de perechi de VAR = VALUE utilizat de programe. Pentru a vedea mediul înconjurător, de tip destul de env de comandă. Pentru a adăuga o variabilă de mediu, pur și simplu de tip export VARIABLE = valoare și pentru a elimina variabila din mediu, este necesar să se apela la export variabile -n. Fii atent: export - l vnutrennayaya echipa BASH coajă; în alte scoici (csh, KSH.) utilizează diferite comenzi pentru lucrul cu mediul înconjurător. variabila de mediu LD_LIBRARY_PATH conține o listă de „locuri“ suplimentare separate dvoetochieyami în cazul în care ar trebui să linkovschih căutare biblioteca.
În ciuda prezenței a două mecanisme de transfer de date cu privire la locație non-standard de biblioteci, este mai bine să plaseze biblioteca în proiectul final în / lib și / usr / lib. Permis locația bibliotecilor în subdirectoarele / usr / lib și / usr / local / lib (cu indicarea -Wl, -rpath). Dar, forțând utilizatorul final pentru a seta LD_LIBRARY_PATH este aproape întotdeauna un stil de programare rău.
Următorul important detaliu - procesul de creare a bibliotecii. Bibliotecile statice sunt create folosind ar arhivator și partajate - folosind gcc cu opțiunea -shared. În acest caz, din nou, provoacă linker gcc, dar nu pentru asamblarea binar, și pentru a crea o bibliotecă de legături dinamice.