Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D La Corte in Rete
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Antonino Mazzeo » 8.Esercitazione: Makefile e librerie


Sommario

  • Ciclo di sviluppo
  • Modularizzazione
    • Makefiles
    • Regole
  • Compilazione
  • Librerie
    • Statiche
    • Dinamiche

Ciclo di sviluppo

Dal punto di vista degli indirizzi di memoria

  • Il compilatore crea indirizzi rilocabili (registro base e limite).
  • Il linker “fonde” i moduli separatamente compilati, con trasformazione in indirizzi rilocabili degli indirizzi simbolici delle variabili esterne.
  • Il programma in formato eseguibile contiene: il formato rilocabile, la dimensione, l’entry point.
  • Il caricatore implementa politiche di rilocazione statica o dinamica
Schema del Ciclo di sviluppo

Schema del Ciclo di sviluppo


Modularizzazione

L’uso disciplinato di alcuni meccanismi del linguaggio C++ consente una corretta strutturazione di un programma in moduli.

Tra i principali meccanismi vi sono:

  • la compilazione separata
  • l’inclusione testuale
  • l’uso dei prototipi di funzioni

E’ buona norma tenere separata la specifica di un modulo dalla sua implementazione (scrivendo due file separati).

Fintanto che l’interfaccia resta inalterata, l’implementazione può essere modificata senza dover ricompilare il modulo utente.

Schema esplicativo (modularizzazione)

Schema esplicativo (modularizzazione)


Make e makefile

Digitando il comando make, viene cercato un file di nome “Makefile” nella directory corrente, vengono interpretate ed eseguite le regole ivi contenute.
Una regola di un makefile segue la seguente sintassi:

  • target: dipendenze
  • [tab] comando di sistema

Dato un particolare target, make esegue i comandi presenti alla linea successiva, se le dipendenze sono tutte soddisfatte.

Le dipendenze sono file da cui il target dipende. Tali file possono essere già presenti o creati a loro volta da altri target.

La modifica di una dipendenza (ad es, cambia il contenuto del file) causa la ricostruzione di tutti i target che dipendono da essa.

Make file: compilazione

Nel caso della compilazione separata, ogni regola del makefile costituisce il comando per la compilazione di un modulo sorgente nel suo rispettivo modulo oggetto:

  • file.o: file.cpp file.h
  • g++ -c file.cpp

Il target file.o “dipende” da file.cpp e file.h. Se uno dei due file cambia, file.o va rigenerato.
I vari moduli oggetto possono essere poi “collegati” con un’altra regola:

  • eseguibile: obj1.o ... objN.o
  • g++ -o eseguibile obj1.o ... objN.o

Spesso il makefile specifica una regola di “clean” per ripulire i risultati della compilazione, ovvero file .o ed eseguibili.

Librerie di moduli software

Le tecniche di sviluppo modulare consentono lo sviluppo su base professionale di librerie di moduli software.

Il produttore di una libreria distribuisce:

  • i file di intestazione (che devono essere inclusi dall’utilizzatore nel codice sorgente) dei moduli che fanno parte della libreria;
  • i moduli di libreria in formato oggetto (già compilati), che l’utilizzatore deve collegare assieme ai propri moduli oggetto.

Tale scelta è tipicamente motivata da esigenze di tutela della proprietà, ed inoltre evita di dover ricompilare i moduli di libreria.

Librerie statiche e dinamiche

Una libreria statica è una collezione di moduli oggetto (file .o) in un unico file, con estensione .a

  • Una libreria statica può essere collegata ad altri file oggetto per creare il file eseguibile.
  • Il file eseguibile finale includerà anche gli oggetti della libreria statica (overhead in termini di dimensioni del file eseguibile).

Le librerie dinamiche, o shared library sono anch’esse collezioni di moduli oggetto.

  • A differenza delle librerie statiche, le shared library sono collegate al programma eseguibile in fase di caricamento, e non in fase di collegamento.
  • Si risolve in questo modo il problema dell’overhead in termini di dimensioni del file eseguibile

Prossima lezione

Esercitazione: System call per la gestione dei processi

I materiali di supporto della lezione

Dispense su Makefile e ar

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion

Fatal error: Call to undefined function federicaDebug() in /usr/local/apache/htdocs/html/footer.php on line 93