Quando si installa qualsiasi software dal sorgente, in genere si eseguono comandi come — “make”, “make install”, "make clean", ecc. Vi siete mai chiesti cosa stanno facendo tutti questi comandi make? Certo, sappiamo che sta tentando di compilare e installare il software. Ma perché fare? Che cosa fa veramente?
Per compilare un singolo programma C, il comando cc è molto utile. Per compilare più programmi C, l'utilità Make è molto utile.
Inoltre, i programmatori C e gli amministratori di sistema troveranno utile automatizzare le attività relative alla compilazione utilizzando l'utilità make. In questo articolo, esaminiamo come utilizzare il comando make.
1. Crea il Makefile per una semplice compilazione
Supponiamo che tu abbia il file di programma C di esempio chiamato helloworld.c. Usando il comando cc, in genere lo compileresti come mostrato di seguito.
$ cc -o helloworld helloworld.c
Sebbene non sia necessario utilizzare make per compilare un singolo programma, l'esempio seguente ti darà un'idea su come utilizzare make. Crea un makefile come mostrato di seguito.
$ vim makefile helloworld : helloworld.c cc -o helloworld helloworld.c
Esegui make per creare l'eseguibile helloworld come mostrato di seguito.
$ make helloworld (or) $ make
Poiché makefile contiene solo un "helloworld" di destinazione, puoi anche chiamare il comando make senza alcun argomento come mostrato sopra.."make".
Assicurati che sia makefile che il codice sorgente siano presenti nella stessa directory, altrimenti specifica il rispettivo percorso dei file sorgente in makefile.
Per impostazione predefinita, il comando make prevede che il nome del file make sia Makefile o makefile . Se il nome del file make è diverso da uno qualsiasi di questi due, dovresti specificarlo nel comando make usando l'opzione -f come mostrato di seguito.
$ make -f sample.txt
Per coloro che non conoscono C, leggi l'articolo del programma C Hello World.
2. Crea il Makefile per compilare più di un file
Per la compilazione di più file, utilizziamo tre file:getname.c, getaccno.c e main.c.
Sulla base di questi tre file *.c, creiamo un eseguibile chiamato "getinto".
Utilizzando il comando cc, in genere eseguiresti la compilazione come mostrato di seguito.
$ cc -o getinfo main.c getname.c getaccno.c header.h
Puoi anche compilare i singoli file *.c come mostrato di seguito e infine creare l'eseguibile "getinfo" come mostrato di seguito.
$ cc -c getname.c $ cc -c getaccno.c $ cc -c main.c $ cc -o getinfo main.o getname.o getaccno.o header.h
Usando la nostra amichevole utility make, puoi farlo in modo efficace come mostrato di seguito.
$ vim makefile getinfo:getname.o getaccno.o main.o header.h cc -o getinfo getname.o getaccno.o main.o header.h main.o:main.c cc -c main.c getaccno.o:getaccno.c cc -c getaccno.c getname.o:getname.c cc -c getname.c
Infine, esegui il comando make come mostrato di seguito.
$ make getinfo
Nota: Ogni volta che il comando make viene invocato, controlla e compila solo i file modificati. Questo è enorme per i programmatori C, dove in genere hanno più file C e compilano l'intero progetto più volte durante la fase di sviluppo.
Puoi anche usare gdb per eseguire il debug dei programmi C.
3. Aggiungi destinazione per il processo di pulizia
All'interno del makefile (o Makefile), puoi anche aggiungere target per ripulire i file oggetto, come mostrato di seguito.
clean : rm getname.o getaccno.o main.o
Ora puoi pulire i file oggetto dalla directory corrente come mostrato di seguito.
$ make clean
Nota: Invece di specificare il singolo file *.o nel comando rm, puoi anche dare rm *.o.
Puoi anche creare un file di archivio C (*.a) usando il comando ar.
4. Gestione delle variabili nel Makefile
All'interno di makefile (o Makefile) puoi usare variabili, che possono essere usate in tutto il makefile. Di seguito viene mostrato un esempio di utilizzo, dove $obj contiene tutti i nomi dei file oggetto.
$ vim makefile obj= getname.o getaccno.o main.o getinfo: $(obj) header.h cc -o getinfo getname.o getaccno.o main.o header.h main.o:main.c cc -c main.c getaccno.o:getaccno.c cc -c getaccno.c getname.o:getname.c cc -c getname.c clean: rm getinfo $(obj)
5. Semplificare ulteriormente il Makefile
L'utilità Make richiama implicitamente il comando cc -c per generare file .o per il file .c corrispondente. Non abbiamo davvero bisogno di specificare "cc -c" all'interno del makefile. Quindi, possiamo riscrivere il makefile per riflettere questa regola implicita come mostrato di seguito.
$ vim makefile obj= getname.o getaccno.o main.o getinfo: $(obj) header.h cc -o getinfo getname.o getaccno.o main.o header.h main.o: getaccno.o: getname.o: clean: rm getinfo $(obj)
6. Inserisci i messaggi di debug all'interno di Makefile
Quando stai compilando un grande progetto, potresti voler visualizzare un messaggio amichevole. L'utilità Make può stampare messaggi sull'output standard, il che potrebbe aiutarti a eseguire il debug di potenziali problemi nel processo di creazione. Usa l'istruzione @echo in tutto il makefile come mostrato di seguito per visualizzare i messaggi personalizzati.
$ vim makefile obj= getname.o getaccno.o main.o getinfo: $(obj) header.h cc -o getinfo getname.o getaccno.o main.o header.h @echo "make complete." main.o: getaccno.o: getname.o: clean: rm getinfo $(obj) @echo "getinfo, $(obj) files are removed."
Ecco qua. Make non è più un mistero. Se ti è piaciuto questo articolo, aggiungilo ai segnalibri in delicious o fallo inciampare.