# GCC Basics **GCC** is the GNU Compiler Collection—the default C, C++, and Fortran compiler on most Linux systems. Install it via your package manager along with build tools. ```bash sudo apt install build-essential # Debian/Ubuntu sudo dnf groupinstall "Development Tools" # Fedora/RHEL ``` `build-essential` includes gcc, g++, make, and C library headers. Check the installation: ```bash gcc --version gcc -dumpmachine # target architecture ``` **Compilation pipeline:** GCC runs four stages internally but hides them by default: ```bash gcc -E file.c -o file.i # preprocess (expand macros, includes) gcc -S file.c -o file.s # compile to assembly gcc -c file.c -o file.o # assemble to object code gcc file.o -o program # link object files and libraries ``` Or combine them into one command: `gcc -o program file.c`. GCC automatically runs all stages and produces the executable. **Multi-file projects:** ```bash gcc -c a.c -o a.o # compile each source separately gcc -c b.c -o b.o gcc a.o b.o -o program # link objects together ``` This is the basis for makefiles—compile only changed files, relink to save time. **Common flags:** ```bash gcc -o output input.c # output filename gcc -g input.c # include debug symbols gcc -O2 input.c # optimization level 2 gcc -Wall input.c # enable common warnings gcc -I/path/to/headers input.c # add include path gcc -L/path/to/libs -lmylib input.c # link against library ``` `-o` names the output; without it, the default is `a.out`. `-g` includes debugging information (needed for [[gdb]]). `-O` sets optimization level. `-I` adds header search paths; `-L` and `-l` link against libraries. **Variables used by make:** ```bash CFLAGS=-O3 -Wall -g # compiler flags LDFLAGS=-L/path/to/libs # linker flags gcc $CFLAGS -o app app.c gcc -c $CFLAGS app.c gcc app.o $LDFLAGS -o app ``` These can be set on the command line or in a Makefile, making build configuration centralized and reproducible.