Librerie, File Oggetto ed Eseguibili
Nei capitoli precedenti abbiamo descritto le fasi di traduzione del codice. L’ultimo anello della catena è la Link Phase (Fase di Collegamento), che prende vari “pezzi” compilati e li unisce in un eseguibile, una libreria o un firmware.
File Oggetto (.o o .obj)
Section titled “File Oggetto (.o o .obj)”Quando hai un progetto composto da main.c, math.c e net.c, non li compili in un colpo solo. Puoi compilarli singolarmente producendo dei File Oggetto.
Un file oggetto contiene codice macchina tradotto, ma non può ancora essere eseguito da solo perché manca dei collegamenti con le funzioni esterne.
Con GCC o Clang, per fermare il processo di compilazione prima del collegamento, si usa la flag -c:
# Produce math.ogcc -c math.c -o math.o
# Produce main.ogcc -c main.c -o main.oPer ottenere l’eseguibile finale, dovrai dire al linker di unirli:
gcc main.o math.o -o programma_finaleLibrerie Statiche e Dinamiche
Section titled “Librerie Statiche e Dinamiche”Per organizzare il riutilizzo del codice su vasta scala si usano le Librerie, che possono essere di due tipi:
1. Librerie Statiche (Static Library)
Section titled “1. Librerie Statiche (Static Library)”Sono archivi (.a su Unix, .lib su Windows) che contengono una collezione di file oggetto .o.
Quando compili un programma usando una libreria statica, tutto il codice macchina necessario viene copiato fisicamente all’interno del tuo eseguibile finale.
- Pro: L’eseguibile è indipendente e funziona ovunque senza dipendenze esterne.
- Contro: L’eseguibile occupa molta più memoria, ed eventuali bug risolti nella libreria richiederanno di ricompilare l’intero programma da zero.
Per creare una libreria statica in Linux/Mac (un archivio), si usa lo strumento ar:
ar rcs libMiaLibreria.a math.o net.o2. Librerie Dinamiche (Shared Library)
Section titled “2. Librerie Dinamiche (Shared Library)”Le librerie dinamiche (.so su Linux, .dll su Windows, .dylib su Mac) non vengono integrate nell’eseguibile. Il programma esegue le chiamate, ma il codice della libreria risiede in un file separato e viene caricato in RAM dal Sistema Operativo (solo una volta) quando serve.
- Pro: Molti programmi possono usare la stessa libreria condividendo spazio su disco e RAM, e le librerie possono essere aggiornate indipendentemente (basta sostituire la
.dll). - Contro: Il famoso “DLL Hell”: se all’utente finale manca la libreria o ne ha una versione sbagliata installata, il programma non si avvierà.
Collegare le Librerie al Tuo Codice
Section titled “Collegare le Librerie al Tuo Codice”Quando vuoi produrre l’eseguibile finale e usi librerie esterne, devi usare i parametri di linking:
-l(L minuscola): Specifica il nome della libreria da cercare (il linker ignora i prefissi “lib” e l’estensione, quindi per trovarelibMiaLibreria.asi scrive-lMiaLibreria).-L(L maiuscola): Specifica la directory (cartella) in cui il linker deve andare a cercare la libreria (es.-L./bin).
gcc main.o -L./bin -lMiaLibreria -o mio_programma💻 Esercizio Pratico
Section titled “💻 Esercizio Pratico”Immagina di aver scritto un file che deve usare una funzione proveniente da una libreria matematica esterna. Compila un ipotetico main.c finto, che dichiara il prototipo di una funzione esterna.