c++ library dynamic - Differenza tra librerie statiche e condivise?




4 Answers

Le librerie condivise sono file .so (o in Windows .dll o in OS X .dylib). Tutto il codice relativo alla libreria si trova in questo file e viene referenziato dai programmi che lo utilizzano in fase di esecuzione. Un programma che utilizza una libreria condivisa fa solo riferimento al codice che utilizza nella libreria condivisa.

Le librerie statiche sono file .a (o in Windows .lib). Tutto il codice relativo alla libreria è in questo file, ed è direttamente collegato al programma in fase di compilazione. Un programma che utilizza una libreria statica prende copie del codice che utilizza dalla libreria statica e lo rende parte del programma. [Windows ha anche i file .lib che sono usati per fare riferimento ai file .dll, ma agiscono allo stesso modo del primo].

Ci sono vantaggi e svantaggi in ogni metodo.

Le librerie condivise riducono la quantità di codice duplicato in ciascun programma che fa uso della libreria, mantenendo i file binari ridotti. Inoltre, consente di sostituire l'oggetto condiviso con uno funzionalmente equivalente, ma potrebbe avere aggiunto vantaggi prestazionali senza la necessità di ricompilare il programma che ne fa uso. Le librerie condivise, tuttavia, hanno un piccolo costo aggiuntivo per l'esecuzione delle funzioni e un costo di caricamento in fase di esecuzione poiché tutti i simboli nella libreria devono essere collegati alle cose che usano. Inoltre, le librerie condivise possono essere caricate in un'applicazione in fase di esecuzione, che è il meccanismo generale per l'implementazione di sistemi di plug-in binari.

Le librerie statiche aumentano la dimensione complessiva del file binario, ma significa che non è necessario portare con sé una copia della libreria che viene utilizzata. Poiché il codice è collegato in fase di compilazione, non ci sono costi di caricamento aggiuntivi in ​​fase di esecuzione. Il codice è semplicemente lì.

Personalmente, preferisco le librerie condivise, ma uso le librerie statiche quando è necessario assicurarsi che il binario non abbia molte dipendenze esterne che possono essere difficili da soddisfare, come versioni specifiche della libreria standard C ++ o versioni specifiche della libreria Boost C ++.

Qual è la differenza tra le librerie statiche e condivise?

Uso Eclipse e ci sono diversi tipi di progetti, tra cui librerie statiche e librerie condivise? Uno ha un vantaggio rispetto all'altro?




semplificata:

  • Collegamento statico: un grande eseguibile
  • Collegamento dinamico: un piccolo eseguibile più uno o più file di libreria (file .dll su Windows, .so su Linux o .dylib su macOS)



Per una libreria statica, il codice viene estratto dalla libreria dal linker e utilizzato per creare l'eseguibile finale nel punto in cui compila / compila la tua applicazione. L'eseguibile finale non ha dipendenze sulla libreria in fase di esecuzione

Per una libreria condivisa, il compilatore / linker verifica che i nomi con cui ci si collega esistano nella libreria quando l'applicazione è compilata, ma non sposta il loro codice nell'applicazione. In fase di esecuzione, la libreria condivisa deve essere disponibile.

Il linguaggio di programmazione C di per sé non ha alcun concetto di librerie statiche o condivise: sono completamente una funzionalità di implementazione.

Personalmente, preferisco di gran lunga usare le librerie statiche, poiché semplifica la distribuzione del software. Tuttavia, questa è un'opinione su cui molto sangue (figurativo) è stato versato in passato.




Oltre a tutte le altre risposte, una cosa che non viene ancora menzionata è il disaccoppiamento:

Lasciatemi parlare di un codice di produzione del mondo reale, che ho avuto a che fare con:

Un software molto grande, fatto di> 300 progetti (con visual studio), per lo più costruiti come lib di staticità e infine tutti collegati in un unico enorme eseguibile, si finisce con i seguenti problemi:

-Il tempo di connessione è estremamente lungo. Potresti finire con più di 15 minuti di link, diciamo 10 secondi di tempo di compilazione. Alcuni strumenti sono sul loro ginocchio con un eseguibile così grande, come strumenti di controllo della memoria che devono strumentare il codice. Potresti cadere nel raggiungere limiti che erano stati visti come pazzi.

Più problematico è il disaccoppiamento del software: in questo esempio del mondo reale, i file di intestazione di ogni progetto erano raggiungibili da qualsiasi altro progetto. Di conseguenza è stato estremamente facile per uno sviluppatore aggiungere dipendenze; si trattava solo di includere l'intestazione, perché il link alla fine mostrerà i simboli. Finisce per l'orribile dipendenza dal ciclismo e il caos completo.

Con la libreria condivisa, è un po 'più di lavoro perché lo sviluppatore deve modificare il sistema di costruzione del progetto per aggiungere la libreria dipendente. Ho osservato che il codice di libreria condivisa tende a offrire un'API di codice più pulita.




Related