[Tech] header C

Francesco Poli frx@firenze.linux.it
Mer 31 Dic 2003 18:36:58 CET


On Wed, 31 Dec 2003 13:50:07 +0100 Llewlyn wrote:

> --------------------- cut ---------------------------
> all : main.o mod1.o mod2.o
>         gcc -o app main.o mod1.o mod2.o
>                                                                     
> main : main.c
>         gcc main.c -o main.o
>                                                                     
> mod1 : mod1.c mod1.h
>         gcc mod1.c -o mod1.o
>                                                                     
> mod2 : mod2.c mod2.h
>         gcc mod2.c -o mod2.o
> --------------------- cut ---------------------------

Ci sono alcune cose che andrebbero migliorate, in questo semplice
Makefile ipotetico (non prendere queste osservazioni come attacchi
personali, le dico a beneficio di Valerio):

* ti sei dimenticato l'opzione -c per generare i file oggetto e inoltre
  non c'e` bisogno di specificare il nome del file di output, se da
  pippo.c vuoi ottenere pippo.o:

  $ gcc -c pippo.c

* meglio porre l'accento sul fatto che prima di ogni comando deve essere
  inserito un carattere di tabulazione (tasto Tab) e non alcuni spazi
  bianchi (come potrebbe sembrare):

  target: dependency dependency
  <TAB>command
  <TAB>command
  <TAB>[...]

* se chiami all un target il cui comando genera un file app, il comando
  verra` rieseguito ad ogni volta che l'utente da` il comando

  $ make all

  anche se il file app esiste ed e` gia` aggiornato.
  Meglio chiamarlo app e dichiarare esplicitamente .PHONY i target che
  davvero corrispondono a comandi che vanno rieseguiti sempre ad ogni
  chiamata...

* anche gli altri target vanno chiamati come i file generati (main.o,
  mod1.o, ...) altrimenti make non sa come soddisfare le dipendenze di
  del primo target; anzi lo sa, ma non segue le regole scritte da te
  (vedi dopo)

* i comandi tipici come la compilazione di pippo.c per ottenere pippo.o
  possono essere inferiti da make: non importa specificarli

* probabilmente main.c include anche mod1.h e mod2.h, quindi main.o
  dipende anche da questi: meglio farlo sapere anche a make...


--------------------- cut ---------------------------
app: main.o mod1.o mod2.o
<TAB>gcc -o app main.o mod1.o mod2.o
                                                                      
main.o: main.c mod1.h mod2.h

mod1.o: mod1.c mod1.h

mod2.o: mod2.c mod2.h

--------------------- cut ---------------------------


Spero di essere stato utile...  :)

-- 
             |  GnuPG Key ID = DD6DFCF4 | You're compiling a program
  Francesco  |        Key fingerprint = | and, all of a sudden, boom!
     Poli    | C979 F34B 27CE 5CD8 DC12 |         -- from APT HOWTO,
             | 31B5 78F4 279B DD6D FCF4 |             version 1.8.0
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        non disponibile
Tipo:        application/pgp-signature
Dimensione:  189 bytes
Descrizione: non disponibile
URL:         <http://lists.linux.it/pipermail/flug-tech/attachments/20031231/836586b5/attachment.pgp>


Maggiori informazioni sulla lista flug-tech