GCC è un compilatore o è una raccolta di strumenti per il processo di compilazione?
Sono nuovo su GNU e GCC, scusa se la mia domanda suona stupida.
Sappiamo che GCC sta per GNU Compiler Collection, quindi penso che gcc sia solo un compilatore (da una raccolta di compilatori).
Ma ho anche letto che gcc è un driver del compilatore che contiene Pre-processor (cpp), Compiler (cc1), Assembler (as) e Linker (ld).
Quindi sembra che GCC non sia un compilatore, ma perché wiki dice:
"GCC è un componente chiave della toolchain GNU e il compilatore standard per la maggior parte dei progetti relativi a GNU e Linux"
e cosa significa "1" in cc1, perché si chiama cc1, non cc2, cc3 ... ecc?
Risposte
Nella maggior parte dei casi (in modo un po 'impreciso) chiami gcc il compilatore. Un motivo è che puoi eseguire l'intera catena di strumenti, almeno per progetti semplici, con un singolo comando gcc. Diciamo che hai questomain.c
// main.c
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
}
e compilarlo con
gcc main.c
Quindi tutto ciò che hai menzionato, cpp, cc1, as e ld sarà coinvolto nella creazione dell'eseguibile a.out. Be 'quasi. cpp è vecchio e le versioni più recenti del compilatore hanno il preprocessore integrato.
Se vuoi vedere l'output del preprocessore, usa gcc -E main.c
Come ho già detto, il preprocessore e il compilatore sono integrati oggigiorno, quindi non puoi davvero funzionare cc1senza il preprocessore. Ma puoi generare un file assembly con gcc -S main.ce questo produrrà main.s. Puoi assemblarlo in un file oggetto con il gcc -c main.squale produrrà main.oe poi puoi collegarlo con gcc main.oper produrre il tuo finalea.out
https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/GCC/cc1/index (Enfasi mia)
cc1 è anche indicato come il compilatore vero e proprio.
cc1 preprocessa l'unità di traduzione ac e la compila in codice assembly. Il codice assembly viene convertito in un file oggetto con l'assembler.
Le versioni precedenti di cc1 usavano / usr / bin / cpp per la fase di pre-elaborazione.
https://renenyffenegger.ch/notes/Linux/fhs/usr/bin/cpp (Enfasi mia)
Il preprocessore.
cpp non è bo da confondere con c ++.
Il preprocessore si occupa di cose come
- espansione macro
- rimuovere i commenti
- conversione trigraph
- fuga di nuova riga splicing
- elaborazione delle direttive
La versione più recente di gcc non richiama / usr / bin / cpp direttamente per preelaborare un'unità di traduzione. Piuttosto, la preelaborazione viene eseguita dal compilatore cc1 appropriato.
Lo considererei quasi un duplicato, ma è impossibile creare duplicati cross-site. Relazione tra cc1 e gcc?
Correlato: comando "Compilatore corretto" per il programma C.
e cosa significa "1" in cc1, perché si chiama cc1, non cc2, cc3 ... ecc?
Non lo so. La mia prima ipotesi è stata che hanno appena aggiunto un 1 a cccui era ed è il compilatore standard sui sistemi Unix (escluso Linux). Sulla maggior parte dei sistemi Linux, ccè solo un collegamento a gcc. Ma un'altra buona ipotesi è che rappresenta la prima fase della compilazione. Tuttavia, non ho trovato una buona fonte.