Download - 6 - Biblioteci de Functii

Transcript
Page 1: 6 - Biblioteci de Functii

Biblioteci de subprograme

Page 2: 6 - Biblioteci de Functii

Biblioteci de subprograme

• Bibliotecă: colecție de subprograme, grupate într-un singur fișier (compilat)

• Scop– Reutilizarea codului în mai multe aplicații– Distribuirea către alți utilizatori

• Tipuri– cod sursă, cod binar– statice, dinamice

Page 3: 6 - Biblioteci de Functii

Biblioteci

• Variante de lucru

– În mod comandă• cl.exe - compilator• lib.exe - manager de biblioteci• link.exe - editor de legături

– În mediul de programare (IDE) Visual Studio• În aceeași soluție (mai multe proiecte)• În soluție independentă

Page 4: 6 - Biblioteci de Functii

Biblioteci statice

• Codul subprogramelor utilizate este inclus în executabil

• Extensie– Windows: .lib– Linux: .a

• Avantaje– Un singur fișier executabil– Din bibliotecă se extrage doar codul subprogramelor apelate

• Dezavantaje– Dimensiune (mai) mare a fișierului executabil– Fiecare executabil va include propria copie a subprogramelor

din biblioteca

Page 5: 6 - Biblioteci de Functii

Editare de legături

Biblioteci statice

Fișiere cod sursă(.c, .cpp, .h)

Fișiere cod obiect(.obj)

Biblioteci cod obiect(.lib)

Fișiere cod sursă(.c, .cpp, .h)

Cod binar executabil(.exe)

CompilareManager biblioteci

Biblioteci cod obiect(.lib)

Fișiere cod obiect(.obj)

Compilare

Page 6: 6 - Biblioteci de Functii

Biblioteci statice - exemplu

• Fișiere sursă– antet: matrice.h– implementare matrice.cpp – test test.cpp

//alocare dinamica matrice// I - nr. linii, nr. coloane// E - adresa matriceidouble **aloca_matrice(int m, int n);

//dezalocare matrice dinamica// I - adresa matricei, nr. linii// E - adresa matricei (NULL)double** dezalocare_matrice(double **a, int m);

//produs matrice patrate de dimensiuni egale, prealocate// I - a, b, n// E - cvoid produs_mpn(double** a, double **b, int n, double** c);

//copiaza matrice prealocate// I - a, m, n// E - bvoid copiaza(double** a, int m, int n, double** b);

//citire matrice patrata cu alocare// I - // E - adresa matrice, dimensiunedouble** citire_matrice(int *m);

//afisare matrice patrata// I - adresa matrice, dimensiune// E - void afisare_matrice(double** a, int m);

#include <stdio.h>#include <malloc.h>#include "matrice.h"

//citire matrice patrata cu alocare// I - // E - adresa matrice, dimensiunedouble** citire_matrice(int *m){ int i,j; double** a; printf_s("\n\nDimensiune: "); scanf_s("%d",m); a=new double*[*m]; for(i=0;i<*m;i++) a[i]=new double[*m]; for(i=0;i<*m;i++) for(j=0;j<*m;j++)

{ printf_s("a[%d,%d]= ",i,j); scanf_s("%lf",&a[i][j]);

} return a;}

//afisare matrice patrata// I - adresa matrice, dimensiune// E - void afisare_matrice(double** a, int m){ int i,j; //cout<<"\nMatricea este: \n"; for(i=0;i<m;i++) { for(j=0;j<m;j++)

printf_s("%10.6lf ",a[i][j]); printf_s("\n"); } printf_s("\n");}

#include <stdio.h>#include <conio.h>#include "matrice.h"

void main(){ double** a; int m,n;

a=citire_matrice(&m); afisare_matrice(a,m);

_getch();}

Page 7: 6 - Biblioteci de Functii

Biblioteci statice - exemplu

• În mod comandă– Se creează un director nou pentru proiect în care se salvează cele 3

fișiere– Se execută vcvars32.bat, aflat in subdirectorul bin al Visual Studio

• C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin

– cl -c matrice.cpp• matrice.obj

– lib matrice.obj /out:matrice.lib• matrice.lib

– cl test.cpp matrice.lib• test.exe

Page 8: 6 - Biblioteci de Functii

Biblioteci statice - exemplu• În IDE – creare bibliotecă binară

– Se creează un proiect nou de tip Win32 Console Application• numele soluției: BSIDE, al proiectului: matrice

– În fereastra Application settings se alege • Application type: Static library• Additional options: Empty project, fără Precompiled headers

– Se adaugă la proiect fișierele sursă (antet și implementare)

– Se compilează soluția (Build)

– În directorul BSIDE\Debug se va genera biblioteca binară• Numele bibliotecii: matrice.lib

Page 9: 6 - Biblioteci de Functii

Biblioteci statice - exemplu• În IDE – utilizare bibliotecă binară în aceeași soluție

– Se creează un proiect nou de tip Win32 Console Application• numele proiectului: Test, se adaugă la soluția matrice

– În fereastra Application settings se alege • Application type: Console Application• Additional options: Empty project, fără Precompiled headers

– Se adaugă la proiect fișierul sursă (cu funcția main)– Project > Properties > Common Properties > Framework and

References > Add New Reference… > matrice– Project > Properties > Configuration Properties > C/C++ > General

> Additional Include Directories > calea către matrice.h– Project > Set As StartUp Project– Se compilează soluția (Build)– Se lansează în execuție din IDE sau separat

• Test.exe se află în BSIDE\Debug

Page 10: 6 - Biblioteci de Functii

Biblioteci statice - exemplu• În IDE – utilizare bibliotecă binară în altă soluție

– Se creează un proiect nou de tip Win32 Console Application• numele soluției (și al proiectului): TestS

– În fereastra Application settings se alege • Application type: Console Application• Additional options: Empty project, fără Precompiled headers

– Se adaugă la proiect fișierul sursă (cu funcția main)– Se copiază în directorul proiectului fișierele matrice.h și matrice.lib– Project > Properties > Configuration Properties > Linker > Input >

Additional Dependencies > se adaugă matrice.lib– Se compilează soluția (Build)– Se lansează în execuție

Page 11: 6 - Biblioteci de Functii

Biblioteci dinamice

• Codul subprogramelor utilizate este separat de executabil

• Extensie– Windows: .dll– Linux: .so

• Avantaje– Dimensiune (mai) mică a executabilului– Biblioteca este utilizată în paralel de mai multe aplicații

• Dezavantaje– Mai multe fișiere (executabil + biblioteci dinamice)– Timp suplimentar la execuție– Asigurarea accesului la bibliotecă (calea curentă, PATH)

Page 12: 6 - Biblioteci de Functii

Editare de legături

Biblioteci dinamice

Fișiere cod sursă(.c, .cpp, .h)

Fișiere cod obiect (.obj)Tabela de import (.lib)

Biblioteci dinamice(.dll)

Fișiere cod sursă(.c, .cpp, .h)

Cod binar executabil(.exe)

CompilareEditare de

legături

Biblioteci cod obiect(.lib)

Fișiere cod obiect(.obj)

Compilare

Cod binar executabil(.exe)

Biblioteci dinamice(.dll)

Page 13: 6 - Biblioteci de Functii

Biblioteci dinamice

• Crearea și utilizarea este asemănătoare cu a bibliotecilor statice

• Diferențe– Antetul funcțiilor trebuie să conțină (doar în .h)

__declspec(dllexport)

– La execuție, fișierul .dll trebuie să poată fi găsit

Page 14: 6 - Biblioteci de Functii

Biblioteci dinamice - exemplu

• În mod comandă– Se creează un director nou pentru proiect în care se salvează cele 3

fișiere– Se execută vcvars32.bat, aflat in subdirectorul bin al Visual Studio

• C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin

– cl matrice.cpp /LD• matrice.dll, matrice.lib

– cl test.cpp matrice.lib• test.exe

Page 15: 6 - Biblioteci de Functii

Biblioteci dinamice - exemplu• În IDE – creare bibliotecă binară

– Se creează un proiect nou de tip Win32 Console Application• numele soluției: BDIDE, al proiectului: matrice

– În fereastra Application settings se alege • Application type: DLL• Additional options: Empty project

– Se adaugă la proiect fișierele sursă (antet și implementare)

– Se compilează soluția (Build)

– În directorul matrice\matrice\Debug se va genera biblioteca binară• Numele bibliotecii: matrice.dll, matrice.lib

Page 16: 6 - Biblioteci de Functii

Biblioteci dinamice - exemplu• În IDE – utilizare bibliotecă binară în aceeași soluție

– Se creează un proiect nou de tip Win32 Console Application• numele proiectului: Test, se adaugă la soluția matrice

– În fereastra Application settings se alege • Application type: Console Application• Additional options: Empty project, fără Precompiled headers

– Se adaugă la proiect fișierul sursă (cu funcția main)– Project > Properties > Common Properties > Framework and

References > Add New Reference… > matrice– Project > Properties > Configuration Properties > C/C++ > General

> Additional Include Directories > calea către matrice.h– Project > Set As StartUp Project– Se compilează soluția (Build)– Se lansează în execuție

Page 17: 6 - Biblioteci de Functii

Biblioteci dinamice - exemplu• În IDE – utilizare bibliotecă binară în altă soluție

– Se creează un proiect nou de tip Win32 Console Application• numele soluției (și al proiectului): TestD

– Se copiază în directorul proiectului fișierele matrice.h și matrice.lib– În fereastra Application settings se alege

• Application type: Console Application• Additional options: Empty project, fără Precompiled headers

– Se adaugă la proiect fișierul sursă (cu funcția main)– Project > Properties > Configuration Properties > Linker > Input >

Additional Dependencies > se adaugă matrice.lib– Project > Properties > Configuration Properties > Debugging >

Environment > se adaugă calea către matrice.dll– Se compilează soluția (Build)– Se lansează în execuție

Page 18: 6 - Biblioteci de Functii

Biblioteci• Comparație dimensiuni

• Cînd folosim biblioteci?

• Cînd folosim biblioteci statice / dinamice?

Statică (.lib) Dinamică (.dll)L.C. IDE L.C. IDE

matrice.h 989 B 989 B 1.165 B 1.165 B matrice.lib 3.728 B 14.766 B 3.656 B 3.656 Bmatrice.dll - - 82.432 B 31.232 Btest.exe 83.968 B 31.232 B

30.720 B33.280 B 29.184 B

Page 19: 6 - Biblioteci de Functii

Biblioteci de funcții

• Temă– Creați și testați o bibliotecă formată din funcțiile

necesare prelucrării vectorilor• Bibliotecă statică

– Lucrați în mod comandă– Lucrați în IDE

• Bibliotecă dinamică– Lucrați în mod comandă– Lucrați în IDE

• Tema va fi prezentată la începutul probei practice și este condiție de intrare la proba practică

Page 20: 6 - Biblioteci de Functii

Biblioteci de funcții - Linux

• Instrumente– gcc compilator C– g++ compilator C++– ld editor de legături

• Biblioteci statice– g++ -c matrice.cpp

• functii.o– ar rcs libmatrice.a matrice.o

• libfunctii.a– g++ -static main.cpp –L./ -lmatrice –o main.out

• main.out– ./main.out

Page 21: 6 - Biblioteci de Functii

Biblioteci de funcții - Linux

• Biblioteci dinamice– g++ -c -fPIC matrice.cpp

• functii.o– g++ -shared -o libmatrice.so matrice.o

• libfunctii.so– g++ main.cpp –o main.out -L./ -lmatrice

• main.out– sudo cp libmatrice.so /usr/lib– ./main.out

Page 22: 6 - Biblioteci de Functii

Spor la învăţat!