Sono stato coinvolto in alcuni dibattiti riguardo alle biblioteche di Linux e vorrei confermare alcune cose.
È mia comprensione (per favore correggimi se sbaglio e modificherò il mio post in seguito), ci sono due modi per usare le librerie quando crei un'applicazione:
- Librerie statiche (file .a): al momento del collegamento, una copia dell'intera libreria viene inserita nell'applicazione finale in modo che le funzioni all'interno della libreria siano sempre disponibili per l'applicazione chiamante
- Oggetti condivisi (file .so): al momento del collegamento, l'oggetto viene appena verificato rispetto alla sua API tramite il file di intestazione (.h) corrispondente. La libreria non viene effettivamente utilizzata fino al runtime, dove è necessaria.
L'ovvio vantaggio delle librerie statiche è che consentono all'intera applicazione di essere autonoma, mentre il vantaggio delle librerie dinamiche è che il file ".so" può essere sostituito (cioè: nel caso in cui debba essere aggiornato a causa di una sicurezza bug) senza richiedere la ricompilazione dell'applicazione di base.
Ho sentito alcune persone distinguere tra oggetti condivisi e librerie dinamiche (DLL), anche se sono entrambi file ".so". Esiste una distinzione tra oggetti condivisi e DLL quando si tratta di sviluppo C / C ++ su Linux o qualsiasi altro sistema operativo compatibile POSIX (es. MINIX, UNIX, QNX, ecc.)? Mi è stato detto che una differenza chiave (finora) è che gli oggetti condivisi vengono utilizzati solo in fase di esecuzione, mentre le DLL devono essere aperte prima utilizzando la chiamata dlopen () all'interno dell'applicazione.
Infine, ho anche sentito alcuni sviluppatori menzionare "archivi condivisi", che, a mio avviso, sono anche librerie statiche, ma che non vengono mai utilizzate direttamente da un'applicazione. Al contrario, altre librerie statiche si collegheranno agli "archivi condivisi" per estrarre alcune (ma non tutte) funzioni / risorse dall'archivio condiviso nella libreria statica in fase di creazione.
Grazie in anticipo per il vostro aiuto.
Aggiornare
Nel contesto in cui mi sono stati forniti questi termini, sono stati effettivamente termini errati utilizzati da un team di sviluppatori Windows che hanno dovuto imparare Linux. Ho provato a correggerli, ma le norme linguistiche (errate) sono rimaste bloccate.
- Oggetto condiviso: una libreria che viene automaticamente collegata a un programma all'avvio del programma ed esiste come file autonomo. La libreria è inclusa nell'elenco dei collegamenti al momento della compilazione (ovvero:
LDOPTS+=-lmylib
per un file di libreria denominatomylib.so
). La libreria deve essere presente al momento della compilazione e all'avvio dell'applicazione. - Libreria statica: una libreria che viene unita al programma vero e proprio al momento della compilazione per una singola (più grande) applicazione contenente il codice dell'applicazione e il codice della libreria che viene automaticamente collegato in un programma quando il programma viene creato e il file binario finale contenente entrambi il programma principale e la libreria stessa esistono come un singolo file binario autonomo. La libreria è inclusa nell'elenco dei collegamenti al momento della compilazione (ovvero:
LDOPTS+=-lmylib
per un file di libreria denominato mylib.a). La libreria deve essere presente al momento della compilazione. - DLL: essenzialmente lo stesso di un oggetto condiviso, ma anziché essere incluso nell'elenco dei collegamenti al momento della compilazione, la libreria viene caricata tramite
dlopen()
/dlsym()
comandi in modo che la libreria non debba essere presente al momento della compilazione per la compilazione del programma. Inoltre, non è necessario che la libreria sia presente (necessariamente) all'avvio dell'applicazione o al momento della compilazione , poiché è necessaria solo al momento in cui vengono effettuate ledlopen
/dlsym
chiamate. - Archivio condiviso: essenzialmente come una libreria statica, ma è compilato con i flag "export-shared" e "-fPIC". La libreria è inclusa nell'elenco dei collegamenti al momento della compilazione (ovvero:
LDOPTS+=-lmylibS
per un file di libreria denominatomylibS.a
). La distinzione tra i due è che questo flag aggiuntivo è richiesto se un oggetto condiviso o una DLL desidera collegare staticamente l'archivio condiviso nel proprio codice ed essere in grado di rendere le funzioni nell'oggetto condiviso disponibili per altri programmi, anziché semplicemente utilizzarle interno alla DLL. Ciò è utile nel caso in cui qualcuno ti fornisca una libreria statica e desideri riconfezionarla come SO. La libreria deve essere presente al momento della compilazione.
Aggiornamento aggiuntivo
La distinzione tra " DLL
" e " shared library
" era solo un colloquialismo (pigro, impreciso) nella società in cui lavoravo all'epoca (gli sviluppatori di Windows erano costretti a passare allo sviluppo di Linux e il termine bloccato), aderendo alle descrizioni annotate sopra.
Inoltre, il " S
" letterale finale dopo il nome della biblioteca, nel caso di "archivi condivisi" era solo una convenzione usata in quella società, e non nel settore in generale.
.a
file, la "a" in realtà sta per "archove", ed è semplicemente un archivio di file oggetto. I linker moderni dovrebbero essere abbastanza buoni da non dover includere la libreria while, solo i file degli oggetti nell'archivio necessari e potrebbero anche usare solo le sezioni di codice / dati nei file degli oggetti a cui si fa riferimento.