3. biblioteci de programare

23
BIBLIOTECI DE PROGRAMARE Mihail Croitor

description

Elaborarea aplicatiilor complexe poate fi smiplificata daca problema de elaborare se imparta in probleme mai mici. Atunci fiecare solutie va fi reprezentata printr-un modul - biblioteca de programare. In cadrul prezentarii se face descrierea bibliotecilor de programare, modul de elaborare si de utilizare a lor

Transcript of 3. biblioteci de programare

Page 1: 3. biblioteci de programare

BIBLIOTECI DE PROGRAMARE

Mihail Croitor

Page 2: 3. biblioteci de programare

Cuprins

Ce se numește biblioteca de programare Tipuri bibliotecilor de programare Structura bibliotecilor de programare Particularitățile bibliotecilor de programare Recomandări

Elaborarea bibliotecilor de programare Biblioteci statice Biblioteci dinamice

Utilizarea bibliotecilor de programare Legarea in mod implicit Legarea in mod explicit

Page 3: 3. biblioteci de programare

Biblioteci de programare

Biblioteci de programare sunt arhive ale resurselor de programare, cum ar fi: funcții, clase, obiecte, constante și diferite variabile. Ca constante în biblioteci pot fi definite și datele grafice sau multimedia.

Page 4: 3. biblioteci de programare

Tipuri bibliotecilor de programare

Biblioteci statice La etapa de compilare în aplicația se adaugă fragmente

de cod-obiect din biblioteca, care reprezint funcții (clase sau alte resurse) utilizate.

Biblioteci dinamice La etapa de compilare în aplicația se includ numai

apelurile funcțiilor (sau referințe la resurse) din biblioteca dinamică.

Page 5: 3. biblioteci de programare

Structura bibliotecilor de programare

Fișier antet

Bibliotecastatică

Fișier antet

Bibliotecade import

Bibliotecadinamică

Biblioteci statice Biblioteci dinamice

*.h

*.lib (*.a)

*.h

*.lib (*.a)

*.dll (*.so)

Page 6: 3. biblioteci de programare

Particularitățilebibliotecilor de programare

În program rezultant se adaugă numai codul funcțiilor utilizate.

Programul nu depinde de existența bibliotecilor în SO.

Ocupă mai puțină memorie operativă (relativ).

Volumul programului este mai mare (relativ).

Dacă biblioteca a fost schimbată, se cere recompilarea programului.

Independent de numarul funcțiilor utilizate, programul încarcă in memoria operativă DLL în întregime.

Mai multe programe pot lucra concomitent cu o bibliotecă dll.

Volumul programului este mai mic (relativ)

Este necesară existența bibliotecii dll în SO.

După reînniorea bibliotecii dll recompilarea programului nu este necesară.

Biblioteci statice Biblioteci dinamice

Page 7: 3. biblioteci de programare

Recomandări

Dacă o bibliotecă nu este standardă sau este rară, mai bine de utilizat legarea statică.

Dacă biblioteca este standardă sau una larg utilizată, atunci se recomandă utilizarea legării dinamice.

Se recomandă crearea ambelor versiuni ale bibliotecii: versiunea dinamică și statică.

Page 8: 3. biblioteci de programare

Elaborarea bibliotecilor de programare

Proces de eleborare bibliotecilor seamănă cuelaborareaaplicațiilorobișnuite

Page 9: 3. biblioteci de programare

Biblioteci statice: fișiere-antet

#ifndef _GEOMETRY_H_#define _GEOMETRY_H_

struct point{ double x, y;

point(); point(double, double);};

struct line{ double a, b, c;

line(); line(double, double, double);};

#endif

Fisiere-antet trebuie protejate de includerea repetată cu ajutorul directivelor preprocesorului:#ifndef A_CONSTANT#define A_CONSTANT

#endif

Microsoft VC++ (+ Intel Compiler) permite utilizarea directivei#pragma once

Page 10: 3. biblioteci de programare

Biblioteci statice: codul-sursă

#include "geometry.h"

point::point(): x(0), y(0) {}

point::point(double p1, double p2)

: x(p1), y(p2) {}

line::line(): a(0), b(0), c(0) {}

line::line(double p1, double p2, double p3)

: a(p1), b(p2), c(p3) {}

Codul sursă se scrie în mod obișnuit

Page 11: 3. biblioteci de programare

Biblioteci dinamice: fișier-antet

#ifndef _GEOMETRY_H_#define _GEOMETRY_H_#define DLLEXPORT __declspec(dllexport)

struct DLLEXPORT point{ double x, y; point(); point(double, double);};

struct DLLEXPORT line{ double a, b, c; line(); line(double, double, double); bool contains(const point&) const;};

DLLEXPORT bool contains(const line&, const point&);#endif

Se adaugă o indicație (un macrou) pentru exportulstructurilor și funcțiilor

Cpp fișiere nu se modifică

Page 12: 3. biblioteci de programare

Biblioteci dinamice: fișiere de definiție a modulelor

Fișiere cu extensia .DEF se utilizează pentru definirea funcțiilor exportate de biblioteca (este o alternativă pentru __declspec(dllexport) )

MODULE mylibEXPORTS

min @1isPrime @2nope @3 ; no operation

Page 13: 3. biblioteci de programare

Biblioteci dinamice: punctul de întrare

În biblioteca dinamică poate fi definit punct de întrare (se utilizează windows.h).

BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call){ case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}

Page 14: 3. biblioteci de programare

Utilizarea bibliotecilor de programare

Legarea statică Legarea dinamică implicită Legarea dinamică explicită

Modul de realizare a legării statice coincide cu modul de realizare a legării dinamice implicite.

Page 15: 3. biblioteci de programare

Legare statică

geometry.h

geometry.lib

Copiați fișierul antet în mapa include, biblioteca în lib

Page 16: 3. biblioteci de programare

Utilizare bibliotecii în proiect

1. Indicați calea relativă/absolută pâna la fișierul antet.

2. Indicați în proprietățile proiectului calea până la biblioteca

Page 17: 3. biblioteci de programare

Legarea bibliotecii cu ajutorul unui macrou

#include "../geometry/geometry.h"

#pragma comment(lib, "../Debug/Geometry.lib")

#include <iostream>

int main(){ plane::point p(1, 0), p2(1, 2); //plane::line l(1, -1, 0);

//std::cout << l.contains(p); std::cout << "distance from " << p << " and " << p2 << " is "

<< plane::distance(p, p2) << std::endl; return 0;}

Page 18: 3. biblioteci de programare

Legare explicită

Windows.h HMODULE WINAPI LoadLibrary(LPCTSTR

lpFileName); BOOL WINAPI FreeLibrary(HMODULE hModule); FARPROC WINAPI GetProcAddress(HMODULE

hModule, LPCSTR lpProcName);

Page 19: 3. biblioteci de programare

Legarea explicită

#include <Windows.h>#include <iostream>

int main(){ HMODULE hMdl = LoadLibrary(L"geometry");

if(hMdl != NULL){ std::cout << "Library 'geometry' is loaded" << std::endl; } else{ std::cout << "Library 'geometry' is not loaded" << std::endl; } return 0;}

Biblioteca poate fi legată cu aplicație în momentul necesar cu ajutorul funcției LoadLibrary

Se utilizează WinAPI ( fișierul antet windows.h)

Page 20: 3. biblioteci de programare

Utilizarea funcțiilor din dll

Dacă biblioteca dinamică dll este încărcată în memoria operativă cu ajutorul funcției LoadLibrary, atuncii ea poate fi utilizată fără biblioteca de import.

Dacă în mymath.dll sunt defenite funcții:

#pragma once

typedef unsigned long long u64;

u64 factorial(u64);

bool isSimple(u64);

#include <Windows.h>

#include <iostream>

typedef bool (*pfunc)(unsigned long long);

int _tmain(int argc, _TCHAR* argv[]){

HMODULE hMdl = LoadLibrary(L"mymath");

if(hMdl != NULL){

std::cout << "library is loaded" << std::endl;

pfunc IsPrime = (pfunc)GetProcAddress(hMdl, "isSimple");

if(IsPrime != NULL)

std::cout << "number " << 997 << " is "

<<(IsPrime(997) ? "prime" : "composed")<<std::endl;

else

std::cout << "function not found" << std::endl;

} else{

std::cout << "error library loading" << std::endl;

}

return 0;

}

Page 21: 3. biblioteci de programare

Resurse din dll: funcții

Windows.h LPTSTR MAKEINTRESOURCE(WORD wInteger); HRSRC WINAPI FindResource(HMODULE

hModule, LPCTSTR lpName, LPCTSTR pType); HGLOBAL WINAPI LoadResource(HMODULE

hModule, HRSRC hResInfo); HBITMAP LoadBitmap(HINSTANCE hInstance,

LPCTSTR lpBitmapName); int WINAPI LoadString(HINSTANCE hInstance,

UINT uID, LPTSTR lpBuffer, int nBufferMax);

Page 22: 3. biblioteci de programare

Resurse în dll

Page 23: 3. biblioteci de programare

Utilizarea resurselor din dll

#include <Windows.h>#include <iostream>

int _tmain(int argc, _TCHAR* argv[]){ HMODULE hMdl = LoadLibrary(L"mymath"); if(hMdl != NULL){ LPTSTR str = new wchar_t[1024]; LoadString(hMdl, 101, str, 1024); MessageBox(NULL, str, 0, 0); } else{ std::cout << "error library loading" << std::endl; } return 0;}

Căutarea resursei se face după ID