2009-04-20 7 views
26

L'ultima frase del article catturato la mia attenzioneQual è la differenza tra make e gcc?

[F] o/sviluppatori C++ e C studenti interessati a imparare a programma in C/C++, piuttosto che gli utenti di Linux. Questo perché la compilazione del codice sorgente è semplificata in GNU/Linux mediante il comando "make" .

Ho sempre utilizzato gcc per compilare i miei programmi C/C++, mentre javac per compilare i miei programmi Java. Ho solo usato make per installare programmi sul mio computer configurando/make/make install.

Sembra che sia possibile compilare apparentemente tutti i programmi con il comando make.

Qual è la differenza tra make e gcc?

+0

Va notato che javac comprende una certa risoluzione di dipendenza rudimentale, vale a dire è anche una semplice marca. Cerca in modo ricorsivo (sorgenti di) classi utilizzate da altre classi e le compila quando necessario, anche se non sono menzionate come argomenti. I compilatori o i linker C non lo fanno, in parte perché la connessione tra la libreria di file oggetto resp e da un lato e le fonti non possono essere dedotte come in Java, dove i nomi dei file fisici e i percorsi corrispondono ai nomi e ai pacchetti di classi logiche. –

risposta

52

Bene ... gcc è un compilatore, make è uno strumento per aiutare a creare programmi. La differenza è enorme. Non puoi mai costruire un programma usando esclusivamente make; non è un compilatore. Che cosa fa introduce un file separato di "regole", che descrive come passare dal codice sorgente al programma finito.Quindi interpreta questo file, capisce cosa deve essere compilato e chiama gcc per te. Questo è molto utile per progetti più grandi, con centinaia o migliaia di file di codice sorgente, e per tenere traccia di cose come le opzioni del compilatore, i percorsi di inclusione e così via.

+0

Grazie per la risposta! –

+0

Non è più necessario un makefile per semplici applicazioni di file. Se hai il file 'application.cpp', allora' make application' lo costruirà. –

+0

@LokiAstari Quindi non vi è alcuna differenza tra l'uso di make o gcc per un singolo file? Quando uso gcc, ottengo un file .out ma make dà un file con lo stesso nome e nessuna estensione. Qual è la differenza? – Manoj

13

gcc compila e/o collega un singolo file. Supporta più lingue, ma non sa come combinare diversi file sorgente in un programma non banale, in esecuzione - di solito sono necessari almeno due invocazioni di gcc (compilazione e collegamento) per creare anche i programmi più semplici.

pagina di Wikipedia su GCC lo descrive come un "sistema compilatore":

Il GNU Compiler Collection (di solito abbreviato in GCC) è un sistema compilatore prodotto dal progetto GNU supporta diversi linguaggi di programmazione.

fare è una che richiama il compilatore (che potrebbe essere gcc) in una particolare sequenza di compilare più sorgenti e collegarli tra loro "strumento di costruire". Traccia inoltre le dipendenze tra i vari file di origine e i file oggetto risultanti dalla compilazione di origini e fa solo le operazioni sui componenti che sono stati modificati dall'ultima generazione.

GNUmake è un'implementazione popolare di marca. La descrizione di GNUmake è la seguente:

Make è uno strumento che controlla la generazione di file eseguibili e altri file non di origine di un programma dai file di origine del programma.

Make prende le sue conoscenze su come compilare il programma da un file chiamato makefile, che elenca ciascuno dei file non di origine e come calcolarlo da altri file.

4

Make è uno strumento per la creazione di qualsiasi sistema complesso in cui vi siano dipendenze tra i vari componenti del sistema, facendo la minima quantità di lavoro necessaria.

Se si desidera scoprire tutte le cose che possono essere utilizzate, lo GNU make manual è eccellente.

5

Make spesso utilizzagcc per compilare una moltitudine di file C o C++.

3

È possibile utilizzare make per compilare i programmi C e C++ chiamando gcc o g ++ nel makefile per eseguire tutti i passaggi di compilazione e collegamento, consentendo di eseguire tutti questi passaggi con un semplice comando. Non è un sostituto per il compilatore.

4

make utilizza un Makefile nella directory corrente per applicare un set di regole ai relativi argomenti di input. Make conosce anche alcune regole di default in modo che vengano eseguite anche se non trova un file Makefile (o simile) nella directory corrente. La regola da eseguire per i file cpp si verifica così per chiamare gcc su molti sistemi.

Si noti che non si chiama make con l'ingresso nomi dei file ma piuttosto con nomi delle regole che riflettono l'uscita. Quindi chiamando make xyz si impegnerà ad eseguire regola xyz che di default crea un file xyz (ad esempio sulla base di un file di codice sorgente xyz.cpp.

3

gcc è un compilatore come javac. Si dà file di origine, ti dà un programma.

make è uno strumento di creazione che richiede un file che descrive come creare i file nel progetto in base alle dipendenze tra i file, quindi quando si modifica un file di origine, non è necessario ricostruire tutto (come se si usato uno script di compilazione) make di solito utilizza gcc per compilare effettivamente i file di origine.

+0

Come ho detto in un commento alla domanda dell'OP: javac è più di un semplice compilatore ed esegue controlli di dipendenza basati su regole integrate (che sono semplici a causa del percorso/nome di Java rispetto alla corrispondenza pacchetto/classe). –

2

'gcc' è il compilatore, il programma che trasforma il codice sorgente in un eseguibile. Devi dirgli dove si trova il codice sorgente, cosa produrre e varie altre cose come librerie e opzioni.

"make" è più simile a un linguaggio di scripting per la compilazione di programmi. È un modo per nascondere tutti i dettagli della compilazione della fonte (tutti questi argomenti devi passare il compilatore). Si scrivono tutti i dettagli sopra una volta nel Makefile, quindi non è necessario digitarlo ogni volta per ogni file. Farà anche cose buone come ricompilare i file sorgente che sono stati aggiornati e gestire le dipendenze (se ricompongo questo file, sarà necessario ricompilare QUESTO file.)

11

gcc è un compilatore C: ci vuole una C file sorgente e crea codice macchina, sotto forma di file oggetto non collegato o come programma eseguibile effettivo, che è stato collegato a tutti i moduli e le librerie oggetto.

make è utile per controllare il processo di creazione di un progetto. Un tipico programma C è composto da diversi moduli (.c) e file di intestazione (.h). Sarebbe molto dispendioso in termini di tempo compilare sempre tutto dopo aver modificato qualsiasi cosa, quindi make è progettato per compilare solo le parti che devono essere ricompilate dopo una modifica.

Fa ciò seguendo le regole create dal programmatore. Ad esempio:

foo.o: foo.c foo.h 
    cc -c foo.c 

Questa regola indica che il file foo.o dipende dai file foo.c e foo.h, e se uno di essi cambia, può essere creato eseguendo il comando sulla seconda riga. (Quanto sopra non è la sintassi attuale: make vuole i comandi rientrati da un carattere TAB, che non posso fare in questa modalità di modifica. Immagina che sia lì, però.)

legge le sue regole da un file che di solito è chiamato un Makefile. Poiché questi file sono (tradizionalmente) scritti a mano, make ha un sacco di magia per farti accorciare le regole. Ad esempio, sa che un foo.o può essere creato da un foo.c e sa quale sia il comando per farlo. Pertanto, la regola di cui sopra potrebbe essere ridotto a questo:

foo.o: foo.h 

Un piccolo programma che consiste di tre moduli può avere un Makefile simili:

mycmd: main.o foo.o bar.o 
    $(CC) $(LDFLAGS) -o mycmd main.o foo.o bar.o 
foo.o: foo.h bar.h 
bar.o: bar.h 

make può fare di più che compilare programmi. Un tipico Makefile avrà una regola per pulire i file indesiderati:

clean: 
    rm -f *.o core myapp 

Un'altra regola potrebbe eseguire i test:

check: myapp 
    ./myapp <test.input> test.output 
    diff -u test.correct test.output 

un makefile potrebbe documentazione "costruire": eseguire uno strumento per convertire la documentazione da parte di alcuni marcatori lingua in HTML e PDF, per esempio.

Un Makefile può disporre di una regola di installazione per copiare il programma binario da esso compilato ovunque l'utente o l'amministratore di sistema lo desideri installato.

E così via. Poiché make è generico e potente, viene in genere utilizzato per automatizzare l'intero processo dalla decompressione di un tarball sorgente al punto in cui il software è pronto per essere utilizzato dall'utente.

C'è molto da imparare su make se vuoi impararlo appieno. La versione GNU di make ha una documentazione particolarmente buona: lo http://www.gnu.org/software/make/manual/ lo ha in varie forme.

+1

Vorrei confrontare "make" e "gcc" con "git" e "ftp-transfer" nella tecnologia di rete .: git è come make (aggiorna solo i file modificati se vuoi, che è il caso d'uso comune) e gcc come ftp (cambiando tutto) – Timo

4

make è essenzialmente un sistema esperto per la costruzione di codice. Si impostano le regole per come vengono costruite le cose e da cosa dipendono. Make può quindi guardare i timestamp su tutti i tuoi file e capire esattamente cosa deve essere ricostruito in qualsiasi momento.

gcc è la "raccolta di compilatori gnu". Esistono molti linguaggi supportati (C, C++, Ada, ecc. A seconda della configurazione), ma comunque è solo uno degli strumenti che possono essere utilizzati per creare il tuo sistema.

1

La più grande differenza è che la marca è completa (Are makefiles Turing complete?) mentre gcc non lo è.

+0

Questo è un eccellente confronto tra i due! –