Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 Kanal D va difuza serialul “...

Upgrade xiaomi mi11

securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...
 

Lib vs static lib vs dll

- - - - -
  • Please log in to reply
9 replies to this topic

#1
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
Salut,

Am câteva întrebări referitoare la titlul de mai sus. Din ce înțeleg eu și din ce am citit sunt 3 tipuri de librării.
  • Librării statice (*.lib file) -> conțin obj (cod sursa) pentru anumite obiecte/module curente iar când este folosit acest tip de librărie codul este adăugat direct la executabilul final renunțând astfel la orice fel de dependință externă.
  • Librării (*.lib file) -> sunt tot librării statice însă (din ce am înțeles, vă rog să ma corectați dacă nu e așa) nu conțin cod binar, ci conțin adresele de început alte metodelor din dll (IAT) astfel la runtime executabilul știe de unde să ia metodele datorită adreselor din librărie. Aici s-ar putea și fără acest lib însă încărcarea ar trebui făcută manual (LoadLibrary) și tot manual ar trebui obținută adresa fiecărei metode în parte (GetProcAddress).
  • Librării dinamice (*.dll) sunt librării ce exporta metode și oferă posibilitatea executabilelor să invoce aceste metode fără a fi nevoie sa le copie in corpul aplicației. Oferă un avantaj major atunci când vine vorba de modificarea metodelor deoarece acest lucru nu implică și un nou rebuild ca în cazul librăriilor statice.
Aș vrea dacă se poate să ma ajutați să validez ce am scris mai sus și totodată aș vrea să știu dacă e posibil sa fac diferențe între cele 2 tipuri de librării.
Mulțumesc.

#2
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003
E bine.
Practic ai doua tipuri: static ori dinamic. Lib-ul ala ajutator pt. .dll e doar sa te scuteasca de scris un pic de cod.

Edited by neagu_laurentiu, 22 February 2018 - 22:56.


#3
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
Super, mersi :)

#4
sceptic_schizo

sceptic_schizo

    Member

  • Grup: Members
  • Posts: 638
  • Înscris: 23.02.2009
Prima categorie : pentru fiecare modul - fisier C/C++ compilatorul genereaza fisiere object, pe care ulterior linkerul le contopeste intr-un fiser unic exe sau dll
A doua categorie - lib statice - CONTIN COD care va fi copiat in noul exe, marind dimensiunea acestuia si necesitand un rebuild in caz de upgrade
LoadLibrary si GetProcAddress se aplica la DLL-uri nu la lib statice
Toate exe si dll au un header ce contine address table pentru ca loader-ul sistemului de operare sa le poata mapa in memorie in functie de adresa de baza (base address)

#5
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
Mersi pentru răspuns.
PS: Nu am zis că lib-urile au nevoie de GetProcAddress sau LoadLibrary, am zis că nu este neapărat nevoie de lib-uri (vorbim de cele care nu sunt statice) la încărcarea unui dll. Adresele oferite de lib-ul respectiv pot fi înlocuite interogând direct dll-ul prin GetProcAddress si LoadLibrary.

#6
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003
Chestiunea e ca in practica o sa cam folosesti LoadLibrary/GetProcAddress pentru ca poti avea .dll-uri de la diferite compilatoare C/C++ (si fiecare genereaza "in nebunia lui") sau alte limbaje (si iar nimic nu se mai lipeste). Asa ca lucrul manual e sfant!

http://bcbjournal.or...th_CBuilder.htm

#7
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015

View Postneagu_laurentiu, on 23 februarie 2018 - 14:20, said:

Chestiunea e ca in practica o sa cam folosesti LoadLibrary/GetProcAddress pentru ca poti avea .dll-uri de la diferite compilatoare C/C++ (si fiecare genereaza "in nebunia lui") sau alte limbaje (si iar nimic nu se mai lipeste). Asa ca lucrul manual e sfant!

http://bcbjournal.or...th_CBuilder.htm
O întrebare prostească poate...asta e unul dintre motivele pentru care primești lnk error atunci cand iei o librărie ce are build-ul deja facut? (te pune să o faci din nou cu compilatorul tău)

#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
C++ nu sta bine la compatibilitate a binarelor. Standardul nu impune detalii in privinta asta, asa ca se pot intalnit foarte usor diferente intre ce genereze un compilator si ce genereaza altul. Diferentele pot aparea chiar intre versiuni diferite ale aceluiasi compilator, sau chiar setari diferite de optimizare, nu mai zic de alte compilatoare unde diferente pot fi considerabile (ex. exceptiile).

Exista insa si solutii:
  • Compilezi totul cu acelasi compilator/la aceleasi setari. Cand folosesc, de exemplu, boost versiunea X, pregatesc binare pentru compilatorul cutare, debug/release si 32/64.
  • Exporti doar functii C, evitand sa pasezi tipuri ce nu le intalnesti in C (nu trimiti std::string, trimiti char*, eventual cu size_t pentru dimensiune - grija si aici cat e size_t de mare...)
  • (Sub Windows) Expui obiecte COM. Mai greu putin, dar exista o intreaga infrastructura cu tot felul de facilitati gandita fix pentru a sharui componente binare.


#9
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015

View Postdani.user, on 23 februarie 2018 - 20:07, said:

C++ nu sta bine la compatibilitate a binarelor. Standardul nu impune detalii in privinta asta, asa ca se pot intalnit foarte usor diferente intre ce genereze un compilator si ce genereaza altul. Diferentele pot aparea chiar intre versiuni diferite ale aceluiasi compilator, sau chiar setari diferite de optimizare, nu mai zic de alte compilatoare unde diferente pot fi considerabile (ex. exceptiile).

Exista insa si solutii:
  • Compilezi totul cu acelasi compilator/la aceleasi setari. Cand folosesc, de exemplu, boost versiunea X, pregatesc binare pentru compilatorul cutare, debug/release si 32/64.
  • Exporti doar functii C, evitand sa pasezi tipuri ce nu le intalnesti in C (nu trimiti std::string, trimiti char*, eventual cu size_t pentru dimensiune - grija si aici cat e size_t de mare...)
  • (Sub Windows) Expui obiecte COM. Mai greu putin, dar exista o intreaga infrastructura cu tot felul de facilitati gandita fix pentru a sharui componente binare.

Da, mersi.
Referitor la COM, știu că a făcut cineva un proiecțel (tu sau laurențiu parca) pe undeva pe forum da nu reușesc să dau de el. Știi cunva pe unde e, și-mi poți lăsa un link?:)

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
https://forum.softpe...-c-pur-windows/ mai didactic, intentionat in C fara ++

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate