18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Il punto importante da comprendere è come sia possibile compilare il programma finale prog a<br />

partire dai singoli file sorgente. Le istruzioni da impartire <strong>per</strong> la compilazione sono le seguenti:<br />

$ gcc -c -o func1.o func1.c<br />

$ gcc -c -o func2.o func2.c<br />

$ gcc -o prog prog.c func1.o func2.o<br />

La prima (seconda) istruzione richiede al compilatore di compilare il file sorgente func1.c<br />

(func2.c) e di produrre il file func1.o (func2.o). Il parametro -c fornito <strong>alla</strong> linea di comando<br />

indica al compilatore di effettuare la sola compilazione ma non il linking. Senza questa opzione il<br />

compilatore segnalerebbe un errore, in quanto non è in grado di trovare la funzione main. Infatti,<br />

i due file non sono programmi completi (non contengono la funzionemain!), da cui la segnalazione<br />

di errore.<br />

La terza istruzione richiede al compilatore di compilare il file sorgente prog.c e di effettuare<br />

il linking linkando il contenuto dei file oggetto func1.o e func2.o. Se infatti si tentasse di<br />

compilate il programma prog.c senza linkare i due file, il compilatore segnalerebbe un errore in<br />

quanto non sarebbe in grado di trovare il codice relativo alle due funzioni.<br />

13.1 Il comando make<br />

Il comando make è una utility che <strong>per</strong>mette di effettuare il building automatico di programmi<br />

di grosse dimensioni, ovvero composti da molti file sorgente. In particolare, make <strong>per</strong>mette<br />

di velocizzare notevolmente il processo di ri-compilazione dell’applicazione qualora siano state<br />

effettuate modifiche soltanto ad una parte dei file sorgente.<br />

Comunemente, infatti, in progetti di grosse dimensioni, soltanto pochi file vengono modificati<br />

tra una compilazione e la successiva. In questo caso, make determina quali sono i file sorgente<br />

che devono essere ri-compilati e <strong>per</strong>mette di risparmiare il tempo richiesto da compilazioni non<br />

indispensabili.<br />

L’utilizzo di make si basa sulla scrittura di una serie di regole che specificano quali sono i<br />

file sorgente che compongono l’applicazione, quali sono i comandi che li devono elaborare, e<br />

soprattutto quali sono le loro dipendenze.<br />

Una dipendenza specifica a make quali sono i file che devono essere elaborati <strong>per</strong> ri-generare<br />

il file obiettivo. Il caso tipico è quello dei file oggetto, che dipendono dai rispettivi file sorgente.<br />

La gestione delle dipendenze <strong>per</strong>mette a make di determinare automaticamente quali sono i<br />

file che devono essere ricompilati sulla base dei tempi di creazione e modifica dei file, impostati<br />

dal sistema o<strong>per</strong>ativo ogniqualvolta si o<strong>per</strong>a su un file.<br />

La condizione che <strong>per</strong>mette a make di decidere se un file deve essere ri-generato o meno si<br />

basa sul tempo di creazione e modifica dei file, che viene aggiornato automaticamente dal sistema<br />

o<strong>per</strong>ativo in seguito ad un accesso in scrittura dei file.<br />

make rigenera il file target solo se il tempo di modifica di uno o più file dal quale il target<br />

dipende è più recente del tempo di creazione del file target.<br />

Tipicamente, make viene utilizzato <strong>per</strong> effettuare il building di programmi scritti in C e C++,<br />

ma il suo principio di funzionamento è completamente generale, e può quindi essere utilizzato<br />

<strong>per</strong> gestire un qualunque progetto software.<br />

In linea di principio, l’utilizzo di make <strong>per</strong> la generazione del file eseguibile non è strettamente<br />

necessaria. D’altra parte, il suo utilizzo si rivela sempre più indispensabile al crescere della<br />

complessità del programma, in particolare quando quest’ultimo è composto da molti file sorgente.<br />

In tal caso <strong>per</strong>mette di risparmiare molto tempo compilando soltanto i file sorgenti modificati<br />

dopo l’ultima compilazione.<br />

133

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!