uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/uputstvo_dll.pdf · uputstvo za...

13
Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog okruženja Microsoft Visual Studio 2010 Autor: dipl.ing. Nemanja Kojić, asistent Decembar 2013.

Upload: others

Post on 20-Oct-2019

18 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Uputstvo za pravljenje i korišdenje

biblioteka sa dinamičkim povezivanjem (.dll)

pomodu razvojnog okruženja Microsoft Visual Studio 2010

Autor: dipl.ing. Nemanja Kojić, asistent

Decembar 2013.

Page 2: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Korak 1 Otvoriti okruženje Visual Studio 2010/2012 i izborom opcije File/New Project započeti pravljenje novog

projekta, kao što je prikazano na slici 1.

Slika 1 Započeto pravljenje projekta za dinamičku biblioteku.

Korak 2 Odabrati opciju Next, da bi se otvorila stranica za konfigurisanje projekta, kao što je prikazano na slici 2.

Slika 2 Otvara se dijalog za inicijalno podešavanje projekta dinamičke biblioteke.

Page 3: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Korak 3 Izabrati opcije za pravljenje dinamičke biblioteke i potvrditi unos pritiskom na dugme OK, kao što je

prikazano na slici 3.

Slika 3 Inicijalno podešavanje projekta dinamičke biblioteke.

Korak 4 Dodati zaglavlje u projekat dinamičke biblioteke i u njemu implementirati makro definicije za izvoz simbola.

Svaki javno dostupni simbol u dinamičkoj biblioteci, kojem treba pristupiti spolja, mora biti označen kao

simbol koji se izvozi. To se postiže dodavanjem ključne reči __declspec(dllexport) svakoj deklaraciji

imena koje treba izvesti i učiniti dostupnim spolja.

Data ključna reč se upotpunjuje informacijom o tome da li simbol izvozi (dllexport) ili se simbol uvozi iz

neke druge dinamičke biblioteke (dllimport). Uvoz imena iz dinamičke biblioteke je posebno bitan kada

se dinamička biblioteka koristi u drugom projektu.

Kada se isporučuje dinamička biblioteka, isporučuju se slededi produkti:

- sva zaglavlja u kojima se nalaze imena izvezena iz biblioteke (.h),

- fajl dinamičke biblioteke (.dll) sa prevodom implementiranih funkcija,

- adapterska statička (.lib) biblioteka koja se povezuje statički sa drugim projektom i delegira pozive

funkcijama u dinamičkoj biblioteci.

Kada se isporučuju zaglavlja sa simbolima koji se koriste u drugom projektu, dati simboli u tom slučaju

moraju biti označeni ključnom rečju __declspec(dllimport), čime se linkeru signalizira da su ved

definisani u dinamičkoj biblioteci, na osnovu čega je mogude program uspešno povezati.

Da bi se izbeglo dupliranje izvornog koda, promena smera uvoza/izvoza simbola se jednostavno

implementira korišdenjem makro definicija, kao što je prikazano na slededoj slici 4 i 5.

Page 4: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Slika 4 Dodati zaglavlje sa definicijom makroa za uvoz/izvoz simbola u/iz dinamičke biblioteke.

Implementacija makro definicija je prikazana na slici 5.

Slika 5 Implementirane makro definicije za uvoz/izvoz simbola u/iz dinamičke biblioteke.

Važna napomena: makro DLL_PROJECT_EXPORTS je specijalni makro koji generiše okruženje kada se

napravi projekat dinamičke biblioteke (ime mu se sastoji od naziva projekta i sufiksa _EXPORTS). Pošto

njegova definicija postoji, svaki simbol u dinamičkoj biblioteci, označen makro definicijom

__DLL_PROJECT_API bide simbol koji se izvozi.

Sa druge strane, kada se dinamička biblioteka koristi za pisanje nekog drugog projekta, u njemu nede

postojati ova definicija, tako da de se aktivirati #else grana (__declspec(dllimport)) uslovnog

grananja i tada de se svi simboli u uključenim zaglavljima date dinamičke biblioteke tretirati kao simboli koji

se uvoze u taj projekt, pa de ih linker tražiti u dinamičkoj biblioteci.

Page 5: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Korak 5 Dodati definicije sopstvenih klasa i funkcija u nova zaglavlja i označiti simbole koji se izvoze, kao što je

prikazano na slici 6.

Slika 6 Definicija klase koja se izvozi iz dinamičke biblioteke (označena je makroom __DLL_PROJECT_API).

Obratiti pažnju da se svi javno dostupni simboli u klasi, automatski izvoze, ukoliko je identifikator njihove

okružujude klase označen kao simbol za izvoz. Jedini izuzetak su prijateljske (friend) funkcije, koje se ne

smatraju članovima klasa, pa se moraju eksplicitno označiti makroom za izvoz. Operatorska funkcija

operator<< nije deo definisane klase, pa stoga mora biti označena, kao i svaka druga globalna funkcija,

makroom __DLL_PROJECT_API.

Korak 6 Implementirati sve metode date klase u .cpp fajlu.

Slika 7 Dodati .cpp fajl i definisati metode klase.

Page 6: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Primetiti da su definicije potpuno standardne, bez obzira što de biti upakovane u dinamičku biblioteku, kao

što je prikazano na slici 8.

Slika 8 Definicije metoda klasa i globalnih funkcija u dinamičkoj biblioteci.

Korak 7 Dodati definiciju DllMain funcije, koja predstavlja ulaznu tačku prilikom povezivanja programa sa

dinamičkom bibliotekom u trenutku pokretanja, kao što je prikazano na slici 9.

Slika 9 Implementacija funkcije DllMain.

Ukoliko se ne navede definicija ove funkcije, kompajler de je generisati sa praznim telom. To je najčešde

sasvim dovoljno za razvoj. Međutim, ukoliko je potrebno posebno reagovati na akcije uvezivanja dinamičke

biblioteke sa glavnim programom, onda se ova funkcija mora implementirati.

Page 7: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Korak 8 Napraviti projekat za glavni program koji treba da koristi dinamičku biblioteku, kao što je prikazano na slici

10.

Slika 10 Pravljenje projekta glavnog programa.

Projekat označiti kao Win32 konzolnu aplikaciju, kao što je prikazano na slici 11.

Slika 11 Podešavanja projekta glavnog programa.

Page 8: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Korak 9 Sada treba podesiti projekat glavnog programa i povezati ga sa projektom dinamičke biblioteke.

Najpre treba označiti projekat glavnog programa kao projekat koji de se startovati prilikom pokretanja

programa, kao što je prikazano na slici 12.

Slika 12 Označiti projekat glavnog programa kao StartUp Project.

Podesiti zavisnosti projekta glavnog programa … (slika 13)

Slika 13 Otvoriti dijalog za definisanje zavisnosti projekta.

Page 9: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

... i dodati projekat dinamičke biblioteke u listu svih projekata od kojih zavisi prevođenje projekta glavnog

programa, kao što je prikazano na slici 14.

Slika 14 Podešavanje zavisnosti projekta glavnog programa.

Zatim u skup referenci projekte glavnog programa (slika 15)...

Slika 15 Otvoriti dijalog za definisanje referenci.

Page 10: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

... dodati projekat biblioteke, što de koristit linkeru u trenutku povezivanja glavnog programa sa kodom

dinamičke biblioteke (tačnije povezivanje sa adapterskom bibliotekom .lib koja se generiše i isporučuje uz

.dll fajl). Nakon što se otvori dijalog Property Pages, pritisnuti dugme Add New Reference i nakon toga se

otvara dijalog Add Reference, kao na slici 16.

Slika 16 Dodati reference ka projektima koji su potrebni projektu glavnog programa za generisanje izvršnog fajla.

Kada se pritisne dugme OK, referenca se dodaje u skup referenci, kao što je prikazano na slici 17.

Slika 17 Pregled referenci projekta.

Page 11: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Potrebno je podesiti i putanje za uključivanje zaglavlja iz dinamičke biblioteke (slika 17), kako bi

pretprocesor mogao da ih pronađe u projektu biblioteke pre nego što se započne prevođenje projekta

glavnog programa.

Otvoriti dijalog Property Pages (slika 18).

Slika 18 Otvoriti dijalog Property Pages.

U stablu Configuration Properties odabrati čvor “C/C++”/General i kliknuti na polje Additional Include

Directories. Otvara se dijalog Additional Include Directories i tada dodati putanju do direktorijuma

biblioteke u kojem se nalaze fajlovi zaglavlja, kao što je prikazano na slici 19. Obratiti pažnju da se putanja

može navesti i relativno, što se inače i preporučuje (zbog prenosivosti projekta na drugi računar).

Slika 19 Dodavanje putanja do fajlova zaglavalja u projektu dinamičke biblioteke.

Page 12: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Kada se pritisne dugme OK, dijalog se zatvara i može se videti dodata putanja. Odabrati dugme Apply/OK i

zatvoriti dijalog Property Pages. Time se završava postupak podešavanja putanja do fajlova zaglavlja, kao

što je prikazano na slici 20.

Slika 20 Pregled podešavanja projekta. Vide se dodate putanje do eksternih fajlova zaglavlja.

Korak 10 Napisati glavni program (main) i koristiti klase i funkcije iz date dinamičke biblioteke, kao što je prikazano

na slici 21.

Slika 21 Primer glavnog programa koji koristi simbole iz dinamičke biblioteke.

Page 13: Uputstvo za pravljenje i korišdenje - oop.etf.rsoop.etf.rs/vezbe/Uputstvo_DLL.pdf · Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll) pomodu razvojnog

Prevesti izvorni kod rešenja aktiviranjem opcije Build/Rebuild All. Pradenjem ispisa prilikom prevođenja

izvornog koda rešenja, može se videti da se prilikom prevođenja projekta dinamičke biblioteke stvaraju i

sam fajl dinamičke biblioteke (.dll), kao i istoimeni fajl statičke adapterske biblioteke (.lib), koji de statički

biti uvezan u izvršni fajl glavnog programa i delegirati pozive dinamičkoj biblioteci.

Slika 22 Pradenje prevođenja izvornog koda rešenja.

Pokrenuti konačno glavni program i pratiti izvršavanje. Pošto je u ovom primeru implementirana funkcija

DllMain, može se dodatno pratiti i ispis u trenucima njenog pozivanja, kao što je prikazano na slici 23.

Slika 23 Izvršavanje prevedenog programa.