Junior
Kokius bibliotekų tipus žinote ir kuo jie skiriasi?
sobes.tech AI
Atsakymas iš AI
Bibliotekų tipai:
- Statinės bibliotekos (.a Linux, .lib Windows): Bibliotekos kodas tiesiogiai įtraukiamas į programos vykdomąjį failą kompiliacijos metu. Programa tampa didesnė, tačiau nepriklauso nuo bibliotekos buvimo sistemoje vykdymo metu. Kiekviena programa, naudojanti statinę biblioteką, turi savo kopiją kodo.
- Dinaminės (dalijamos) bibliotekos (.so Linux, .dll Windows): Bibliotekos kodas įkeliama į programos atmintį vykdymo metu. Tai sumažina programos vykdomojo failo dydį. Kelios programos gali naudoti tą pačią bibliotekos kopiją, taupant atmintį. Norint tinkamai veikti, dinaminė biblioteka turi būti sistemoje.
Pagrindiniai skirtumai:
| Bruožas | Statinė biblioteka | Dinaminė biblioteka |
|---|---|---|
| Programos dydis | Didesnis (kodas įtrauktas) | Mažesnis (kodas įkeltas vykdymo metu) |
| Priklausomybė | Nėra (kodas viduje vykdomajame faile) | Yra (biblioteka turi būti sistemoje) |
| Atminties naudojimas | Kiekviena programa turi savo kopiją | Kelios programos gali naudoti tą pačią kopiją |
| Kodo atnaujinimas | Reikalauja perkompiliuoti programą | Gali būti atnaujinta atskirai, biblioteka |
Pavyzdys, kaip naudoti statinę biblioteką C++ (sąlyginis):
// main.cpp
#include "static_library.h" // Statinės bibliotekos antraštės failas
int main() {
// Kviečiame funkciją iš statinės bibliotekos
static_function();
return 0;
}
Pavyzdys, kaip naudoti dinaminę biblioteką C++ (sąlyginis):
// main.cpp
#include <dlfcn.h> // Dinaminės bibliotekos įkėlimo funkcijos
int main() {
// Dinaminės bibliotekos įkėlimas
void* handle = dlopen("dynamic_library.so", RTLD_LAZY);
if (!handle) {
// Klaidos apdorojimas
}
// Funkcijos adreso gavimas iš bibliotekos
void (*dynamic_function)(void) = (void (*)(void))dlsym(handle, "dynamic_function");
if (!dynamic_function) {
// Klaidos apdorojimas
}
// Funkcijos iškvietimas
dynamic_function();
// Bibliotekos uždarymas
dlclose(handle);
return 0;
}