Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di AtoXx
    Registrato dal
    Nov 2007
    Messaggi
    119

    Domanda sul makefile......

    Ciao a tutti.....Sò bene o male come funziona un makefile...però ho un dubbio riguardo a questa dicitura %o, che nn capisco cosa vuol dire.....vi posto un esempio:
    CFLAGS=-Wall -O1
    LDFLAGS=
    CC=gcc
    PROGRAMMA=vettori
    OBJECTS=main.o somma.o modulo.o
    INCLUDE=somma.h modulo.h vettori.h

    %.o: %.c $(INCLUDE)
    $(CC) -c -o $@ $< $(CFLAGS)

    $(PROGRAMMA).exe: $(OBJECTS)
    $(CC) -o $@ $^ $(LDFLAGS)
    strip $(PROGRAMMA).exe

    .PHONY: clean
    clean:
    rm $(PROGRAMMA).exe $(OBJECTS) -f

    Magari a spiegarlo con quest'esempio viene meglio

    ed anche nn capisco il significato di $@ $^ e $< se me lo spiegate ve ne sarei grato...grazie

  2. #2
    codice:
    %.o: %.c $(INCLUDE)
    Questa linea dichiare che la regola per creare files .o da files .c (il % è il carattere jolly dei makefiles).

    Generalmente, una regola del makefile contiene le seguenti direttive:

    codice:
    target: sources
            commands...
    che dice al sistema che per generare "target" bisogna eseguire i "commands" comandi sui file "sources". Ergo:

    $@ = target
    $< = il primo file di sources
    $^ = sources

    Per esempio, dato il seguente Makefile:

    codice:
    destinazione: da1 da2 da3
            @echo '$$'"@ = $@"
            @echo '$$'"< = $<"
            @echo '$$'"^ = $^"
    
    da%:
            @echo > $@
    il comando make ti stamperà:

    codice:
    $@ = destinazione
    $< = da1
    $^ = da1 da2 da3
    e ti creerà i files "da1", "da2" e "da3": provare per credere.

    PS: la manfrina @echo '$$'"... serve per evitare di far espandere $@, $< e $^, in modo da avere

    codice:
    $@ = destinazione
    e non

    codice:
    destinazione = destinazione

  3. #3
    Utente di HTML.it L'avatar di AtoXx
    Registrato dal
    Nov 2007
    Messaggi
    119
    perfetto ho capito l'utilizzo di $@ $^ e $< però ancora nn mi è tanto chiaro il %.o...al posto del % il makefile cosa mette??scusa se sono testa dura...

    Originariamente inviato da ntd
    codice:
    %.o: %.c $(INCLUDE)
    Questa linea dichiare che la regola per creare files .o da files .c (il % è il carattere jolly dei makefiles).

  4. #4
    Qualsiasi cosa, è il carattere jolly: pensalo come a *.o: *.c
    Guarda l'esempio che ti ho riportato, lo uso nel target da%. Ciò vuol dire che ogni volta che c'è bisogno di un file che comincia per 'da', il make esegue il comando @echo > da...

    Questi due frammenti sono equivalenti:

    codice:
    da1:
            @echo > da1
    
    da2:
            @echo > da2
    
    da3:
            @echo > da3
    codice:
    da%:
            @echo > $@
    ma il secondo è molto più comodo (e funziona anche per 'da4', 'dagiassai' e 'da.carajo').

  5. #5
    Utente di HTML.it L'avatar di AtoXx
    Registrato dal
    Nov 2007
    Messaggi
    119
    ok riguardo al tuo esempio l'ho capito...però nn capisco nel mio esempio ke fa...

    --->>>%.o: %.c $(INCLUDE)
    prende qualunque file con estensione .o??? capito cosa voglio dire???

  6. #6
    Stai approcciando il problema in modo sbagliato, porongo. Il Makefile NON è un batch che esegue i comandi in sequenza, esegue quando è necessario (quindi mai in sequenza). Espandendo le variabili magari comprendi:

    codice:
    %.o: %.c somma.h modulo.h vettori.h
            gcc -c -o $@ $< -Wall -O1
    
    vettori.exe: main.o somma.o modulo.o
            gcc -o $@ $^
            strip vettori.exe
    Quando fai "make", viene cercato il primo target univoco (vettori.exe) ed eseguito. Per essere creato, 'vettori.exe' necessita dei files 'main.o', 'somma.o', 'modulo.o': se questi files non esistono che succede? Viene cercato un target per generarli, cioè %.o

    target.exe ha bisogno di main.o, per cui viene eseguito il target virtuale (sostituendo main a %):

    codice:
    main.o: main.c somma.h modulo.h vettori.h
            gcc -c -o $@ $< -Wall -O1
    che esegue il comando 'gcc -c -o main.o main.c -Wall -O1' e genera (se non ci sono errori) 'main.o'.
    Continuando, target.exe ha bisogno di somma.o, per cui viene eseguito il target virtuale:

    codice:
    somma.o: somma.c somma.h modulo.h vettori.h
            gcc -c -o $@ $< -Wall -O1
    che esegue il comando 'gcc -c -o somma.o somma.c -Wall -O1' e genera 'somma.o'.
    Lo stesso per 'modulo.o'. Quando tutte le dipendenze sono soddisfatte, vengono eseguiti i comandi per generare 'vettori.exe':

    gcc -o vettori.exe main.o somma.o modulo.o
    strip vettori.exe

    That's all, folks

  7. #7
    Utente di HTML.it L'avatar di AtoXx
    Registrato dal
    Nov 2007
    Messaggi
    119
    aaaaaaaaaaaaaaaaaaaaaaaaa................adesso ho capito...perfetto!!!!!madonna ke stupido....ti ringrazio ntd!!!!che stupido :S....grazie per la pazienza!!!!smack

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.