GCC - GNU Compiler Collection¶
Die GNU Compiler Collection (GCC) steht als eines der einflussreichsten und weit verbreiteten Compilersysteme in der Geschichte des Computings. Ursprünglich von Richard Stallman 1987 als GNU C Compiler geschaffen, hat sich GCC zu einer umfassenden Sammlung von Compilern entwickelt, die mehrere Programmiersprachen wie C, C++, Ziel-C, Fortran, Ada, Go und D unterstützen. Als offizieller Compiler für GNU- und Linux-Systeme hat GCC eine zentrale Rolle bei der Entwicklung von Frei- und Open-Source-Software gespielt, die die Grundlage für unzählige Anwendungen, Betriebssysteme und eingebettete Systeme weltweit bietet. Die robusten Optimierungsfunktionen, die umfangreiche Plattformunterstützung und die Einhaltung von Sprachstandards haben es zum Compiler der Wahl für alles von kleinen Embedded-Projekten bis hin zu großformatigen Unternehmensanwendungen und leistungsstarken Rechensystemen gemacht.
Installation und Inbetriebnahme¶
GCC auf verschiedenen Plattformen installieren¶
```bash
Ubuntu/Debian installation¶
sudo apt update sudo apt install gcc g++ build-essential
Install specific version¶
sudo apt install gcc-11 g++-11
Install development tools¶
sudo apt install libc6-dev linux-libc-dev
CentOS/RHEL/Fedora installation¶
sudo dnf groupinstall "Development Tools" sudo dnf install gcc gcc-c++
Or using yum (older systems)¶
sudo yum groupinstall "Development Tools" sudo yum install gcc gcc-c++
macOS installation (via Xcode Command Line Tools)¶
xcode-select --install
Or using Homebrew¶
brew install gcc
Windows installation (MinGW-w64)¶
Download from https://www.mingw-w64.org/¶
Or using MSYS2¶
pacman -S mingw-w64-x86_64-gcc
Verify installation¶
gcc --version g++ --version
Check supported languages¶
gcc --help=target
List all installed GCC versions¶
ls /usr/bin/gcc*
Set default version (Ubuntu/Debian)¶
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 60 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 60 ```_
GCC Konfiguration und Umwelt¶
```bash
Environment variables¶
export CC=gcc export CXX=g++ export CFLAGS="-O2 -Wall" export CXXFLAGS="-O2 -Wall -std=c++17"
Cross-compilation setup¶
export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++
Library paths¶
export LD_LIBRARY_PATH=/usr/local/lib:\(LD_LIBRARY_PATH export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:\)PKG_CONFIG_PATH
Include paths¶
export C_INCLUDE_PATH=/usr/local/include:\(C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/usr/local/include:\)CPLUS_INCLUDE_PATH
Check GCC configuration¶
gcc -v gcc -dumpmachine gcc -dumpversion
Show default include paths¶
gcc -E -v - </dev/null g++ -E -v - </dev/null
Show default library paths¶
gcc -print-search-dirs
Show built-in defines¶
gcc -dM -E - </dev/null
Show supported targets¶
gcc --print-targets
Show supported multilib¶
gcc -print-multi-lib ```_
Grundlegende Erstellung¶
Einfache Compilation Commands¶
```bash
Compile C program¶
gcc hello.c -o hello gcc -o hello hello.c
Compile C++ program¶
g++ hello.cpp -o hello g++ -o hello hello.cpp
Compile without linking (object file only)¶
gcc -c source.c g++ -c source.cpp
Compile multiple source files¶
gcc file1.c file2.c file3.c -o program g++ file1.cpp file2.cpp file3.cpp -o program
Link object files¶
gcc file1.o file2.o file3.o -o program
Compile and run in one line¶
gcc hello.c -o hello && ./hello
Compile with specific C standard¶
gcc -std=c99 program.c -o program gcc -std=c11 program.c -o program gcc -std=c17 program.c -o program
Compile with specific C++ standard¶
g++ -std=c++11 program.cpp -o program g++ -std=c++14 program.cpp -o program g++ -std=c++17 program.cpp -o program g++ -std=c++20 program.cpp -o program
Compile for different architectures¶
gcc -m32 program.c -o program32 # 32-bit gcc -m64 program.c -o program64 # 64-bit
Generate assembly output¶
gcc -S source.c # Creates source.s gcc -S -o output.s source.c
Generate preprocessed output¶
gcc -E source.c # Output to stdout gcc -E source.c -o source.i # Save to file
Verbose compilation¶
gcc -v source.c -o program
Show compilation commands without executing¶
gcc -### source.c -o program ```_
Compilation Stages¶
```bash
Four stages of compilation: preprocessing, compilation, assembly, linking¶
Stage 1: Preprocessing (cpp)¶
gcc -E source.c -o source.i cpp source.c source.i
Stage 2: Compilation (cc1)¶
gcc -S source.i -o source.s gcc -S source.c -o source.s
Stage 3: Assembly (as)¶
gcc -c source.s -o source.o as source.s -o source.o
Stage 4: Linking (ld)¶
gcc source.o -o program ld source.o -o program
Stop after specific stage¶
gcc -E source.c # Stop after preprocessing gcc -S source.c # Stop after compilation gcc -c source.c # Stop after assembly
Save intermediate files¶
gcc -save-temps source.c -o program
Use specific tools¶
gcc -B/path/to/tools source.c # Use tools from specific directory ```_
Optimierungsoptionen¶
Optimierungsstufen¶
```bash
No optimization (default, fastest compilation)¶
gcc -O0 source.c -o program
Basic optimization (good balance)¶
gcc -O1 source.c -o program
Standard optimization (recommended for most cases)¶
gcc -O2 source.c -o program
Aggressive optimization (may increase compilation time)¶
gcc -O3 source.c -o program
Optimize for size¶
gcc -Os source.c -o program
Optimize for fast compilation¶
gcc -Ofast source.c -o program
Optimize for debugging¶
gcc -Og source.c -o program
Profile-guided optimization (two-step process)¶
Step 1: Compile with profiling¶
gcc -O2 -fprofile-generate source.c -o program ./program # Run with representative input
Step 2: Compile with profile data¶
gcc -O2 -fprofile-use source.c -o program_optimized
Link-time optimization¶
gcc -O2 -flto source1.c source2.c -o program
Specific optimization flags¶
gcc -O2 -funroll-loops source.c -o program gcc -O2 -finline-functions source.c -o program gcc -O2 -fomit-frame-pointer source.c -o program ```_
Erweiterte Optimierung¶
```bash
Vectorization¶
gcc -O2 -ftree-vectorize source.c -o program gcc -O3 -march=native source.c -o program
Loop optimizations¶
gcc -O2 -funroll-loops source.c -o program gcc -O2 -funroll-all-loops source.c -o program gcc -O2 -fpeel-loops source.c -o program
Function inlining¶
gcc -O2 -finline-functions source.c -o program gcc -O2 -finline-small-functions source.c -o program gcc -O2 -finline-functions-called-once source.c -o program
Architecture-specific optimization¶
gcc -O2 -march=native source.c -o program gcc -O2 -march=skylake source.c -o program gcc -O2 -mtune=generic source.c -o program
Show optimization report¶
gcc -O2 -fopt-info source.c -o program gcc -O2 -fopt-info-vec source.c -o program gcc -O2 -fopt-info-loop source.c -o program
Disable specific optimizations¶
gcc -O2 -fno-inline source.c -o program gcc -O2 -fno-unroll-loops source.c -o program
Optimization for specific use cases¶
gcc -O2 -ffast-math source.c -o program # Fast math (may reduce precision) gcc -O2 -fno-math-errno source.c -o program # Don't set errno for math functions gcc -O2 -funsafe-math-optimizations source.c -o program ```_
Warn- und Fehleroptionen¶
Warnstufen¶
```bash
Basic warnings¶
gcc -Wall source.c -o program
Extra warnings¶
gcc -Wextra source.c -o program
All warnings¶
gcc -Wall -Wextra source.c -o program
Treat warnings as errors¶
gcc -Werror source.c -o program
Specific warning categories¶
gcc -Wpedantic source.c -o program # Strict ISO C compliance gcc -Wconversion source.c -o program # Type conversion warnings gcc -Wshadow source.c -o program # Variable shadowing gcc -Wunused source.c -o program # Unused variables/functions gcc -Wuninitialized source.c -o program # Uninitialized variables gcc -Wformat source.c -o program # Format string checking gcc -Wcast-align source.c -o program # Cast alignment issues gcc -Wwrite-strings source.c -o program # String literal modifications
Disable specific warnings¶
gcc -Wall -Wno-unused-variable source.c -o program gcc -Wall -Wno-format source.c -o program
C++-specific warnings¶
g++ -Wall -Weffc++ source.cpp -o program # Effective C++ guidelines g++ -Wall -Wold-style-cast source.cpp -o program g++ -Wall -Woverloaded-virtual source.cpp -o program
Enable additional useful warnings¶
gcc -Wall -Wextra -Wpedantic -Wformat=2 -Wconversion \ -Wshadow -Wunused -Wuninitialized -Wcast-align \ -Wwrite-strings source.c -o program
Show all available warnings¶
gcc --help=warnings ```_
Fehlerbehebung¶
```bash
Stop on first error¶
gcc -Wfatal-errors source.c -o program
Maximum number of errors¶
gcc -fmax-errors=5 source.c -o program
Colorized output¶
gcc -fdiagnostics-color=always source.c -o program gcc -fdiagnostics-color=auto source.c -o program
Show column numbers in diagnostics¶
gcc -fdiagnostics-show-location=every-line source.c -o program
Show option that triggered warning¶
gcc -fdiagnostics-show-option source.c -o program
Template backtrace limit (C++)¶
g++ -ftemplate-backtrace-limit=0 source.cpp -o program
Syntax-only check (no compilation)¶
gcc -fsyntax-only source.c
Check for undefined behavior¶
gcc -fsanitize=undefined source.c -o program ```_
Debugging und Profiling¶
Debug Information¶
```bash
Generate debug information¶
gcc -g source.c -o program
Different debug levels¶
gcc -g0 source.c -o program # No debug info gcc -g1 source.c -o program # Minimal debug info gcc -g2 source.c -o program # Default debug info gcc -g3 source.c -o program # Maximum debug info
Debug format options¶
gcc -gdwarf-4 source.c -o program # DWARF version 4 gcc -gstabs source.c -o program # Stabs format
Debug with optimization¶
gcc -O2 -g source.c -o program
Split debug information¶
gcc -g -gsplit-dwarf source.c -o program
Compressed debug sections¶
gcc -g -gz source.c -o program
Debug macros¶
gcc -g3 -gdwarf-4 source.c -o program
Address sanitizer¶
gcc -g -fsanitize=address source.c -o program
Memory sanitizer¶
gcc -g -fsanitize=memory source.c -o program
Thread sanitizer¶
gcc -g -fsanitize=thread source.c -o program
Undefined behavior sanitizer¶
gcc -g -fsanitize=undefined source.c -o program
Leak sanitizer¶
gcc -g -fsanitize=leak source.c -o program ```_
Unterstützung bei der Profilierung¶
```bash
Generate profiling information¶
gcc -pg source.c -o program ./program gprof program gmon.out > analysis.txt
Coverage testing¶
gcc --coverage source.c -o program ./program gcov source.c lcov --capture --directory . --output-file coverage.info genhtml coverage.info --output-directory coverage_html
Profile-guided optimization¶
gcc -fprofile-generate source.c -o program ./program # Run with representative data gcc -fprofile-use source.c -o program_optimized
Time profiling¶
gcc -ftime-report source.c -o program
Memory usage profiling¶
gcc -fmem-report source.c -o program
Stack usage analysis¶
gcc -fstack-usage source.c -o program ```_
Bibliotheken und Linking¶
Statische und dynamische Verknüpfung¶
```bash
Link with standard libraries¶
gcc source.c -lm -o program # Math library gcc source.c -lpthread -o program # POSIX threads gcc source.c -ldl -o program # Dynamic loading
Link with custom libraries¶
gcc source.c -L/path/to/lib -lmylib -o program
Static linking¶
gcc -static source.c -o program
Create static library¶
ar rcs libmylib.a file1.o file2.o file3.o
Create shared library¶
gcc -shared -fPIC file1.c file2.c -o libmylib.so
Link with shared library¶
gcc source.c -L. -lmylib -o program
Set runtime library path¶
gcc source.c -L/path/to/lib -lmylib -Wl,-rpath,/path/to/lib -o program
Show library dependencies¶
ldd program
Link order matters¶
gcc source.c -lmylib -lm -o program
Whole archive linking¶
gcc -Wl,--whole-archive -lmylib -Wl,--no-whole-archive source.c -o program
Version script for shared libraries¶
gcc -shared -Wl,--version-script=version.map file1.c -o libmylib.so ```_
Pfade und Preprozessor einschließen¶
```bash
Add include directories¶
gcc -I/path/to/headers source.c -o program gcc -I. -I../include source.c -o program
System include directories¶
gcc -isystem /path/to/system/headers source.c -o program
Define preprocessor macros¶
gcc -DDEBUG source.c -o program gcc -DDEBUG=1 source.c -o program gcc -DVERSION=\"1.0\" source.c -o program
Undefine macros¶
gcc -UDEBUG source.c -o program
Include file directly¶
gcc -include config.h source.c -o program
Show include search paths¶
gcc -E -v - </dev/null
Dependency generation¶
gcc -M source.c # Generate dependencies gcc -MM source.c # Generate dependencies (no system headers) gcc -MD source.c -o program # Compile and generate dependencies gcc -MMD source.c -o program # Compile and generate dependencies (no system headers) ```_
Cross-Compiling¶
Zielarchitektur¶
```bash
Install cross-compilation toolchain¶
sudo apt install gcc-arm-linux-gnueabihf sudo apt install gcc-aarch64-linux-gnu sudo apt install gcc-mingw-w64
Cross-compile for ARM¶
arm-linux-gnueabihf-gcc source.c -o program_arm
Cross-compile for ARM64¶
aarch64-linux-gnu-gcc source.c -o program_arm64
Cross-compile for Windows¶
x86_64-w64-mingw32-gcc source.c -o program.exe
Specify target explicitly¶
gcc -target arm-linux-gnueabihf source.c -o program_arm
Set sysroot for cross-compilation¶
gcc --sysroot=/path/to/target/sysroot source.c -o program
Cross-compilation environment variables¶
export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++ export AR=arm-linux-gnueabihf-ar export STRIP=arm-linux-gnueabihf-strip
Configure for autotools¶
./configure --host=arm-linux-gnueabihf --prefix=/usr/local/arm
CMake cross-compilation¶
cmake -DCMAKE_TOOLCHAIN_FILE=arm-toolchain.cmake .. ```_
Embedded Systems¶
```bash
Compile for bare metal (no OS)¶
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb source.c -o program.elf
Specify memory layout¶
arm-none-eabi-gcc -T linker_script.ld source.c -o program.elf
Generate binary file¶
arm-none-eabi-objcopy -O binary program.elf program.bin
Generate hex file¶
arm-none-eabi-objcopy -O ihex program.elf program.hex
Size information¶
arm-none-eabi-size program.elf
Disassemble¶
arm-none-eabi-objdump -d program.elf
Common embedded flags¶
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard \ -mfpu=fpv4-sp-d16 -Os -ffunction-sections -fdata-sections \ -Wl,--gc-sections source.c -o program.elf ```_
Erweiterte Funktionen¶
Sprache-spezifische Optionen¶
```bash
C-specific options¶
gcc -std=c99 -pedantic source.c -o program gcc -std=gnu99 source.c -o program
C++-specific options¶
g++ -std=c++17 -pedantic source.cpp -o program g++ -std=gnu++17 source.cpp -o program
Objective-C¶
gcc -x objective-c source.m -o program
Mixed language compilation¶
gcc source.c module.cpp -lstdc++ -o program
Enable specific language features¶
g++ -fconcepts source.cpp -o program # C++20 concepts g++ -fcoroutines source.cpp -o program # C++20 coroutines g++ -fmodules-ts source.cpp -o program # C++20 modules
Disable language features¶
g++ -fno-exceptions source.cpp -o program g++ -fno-rtti source.cpp -o program ```_
Sicherheitsmerkmale¶
```bash
Stack protection¶
gcc -fstack-protector source.c -o program gcc -fstack-protector-strong source.c -o program gcc -fstack-protector-all source.c -o program
Position independent code¶
gcc -fPIC source.c -o program gcc -fPIE source.c -o program
Fortify source¶
gcc -D_FORTIFY_SOURCE=2 -O2 source.c -o program
Control flow integrity¶
gcc -fcf-protection source.c -o program
Return address protection¶
gcc -mretpoline source.c -o program
Address space layout randomization¶
gcc -fPIE -pie source.c -o program
Relocation read-only¶
gcc -Wl,-z,relro,-z,now source.c -o program
No execute stack¶
gcc -Wl,-z,noexecstack source.c -o program ```_
Leistungsanalyse¶
```bash
Generate assembly with C code comments¶
gcc -S -fverbose-asm source.c
Show optimization decisions¶
gcc -O2 -fopt-info-vec-optimized source.c -o program gcc -O2 -fopt-info-loop-optimized source.c -o program
Benchmark compilation time¶
time gcc -O2 source.c -o program
Memory usage during compilation¶
/usr/bin/time -v gcc -O2 source.c -o program
Parallel compilation¶
make -j$(nproc)
Use ccache for faster recompilation¶
ccache gcc source.c -o program
Profile compilation¶
gcc -ftime-report -fmem-report source.c -o program ```_
GCCs umfangreiches Feature-Set, reife Optimierungsfähigkeiten und breite Plattform-Unterstützung machen es zu einem unverzichtbaren Werkzeug für die Softwareentwicklung in verschiedenen Domänen. Von einfachen Kommandozeilendiensten bis hin zu komplexen Embedded-Systemen und Hochleistungs-Computing-Anwendungen bietet GCC die Zuverlässigkeit, Leistung und Flexibilität, die benötigt wird, um robuste Softwarelösungen aufzubauen. Sein Engagement für offene Standards, aktive Entwicklungsgemeinschaft und umfassende Dokumentation sorgen dafür, dass GCC an der Spitze der Compiler-Technologie bleibt und sich weiterhin mit den sich ändernden Anforderungen der Software-Entwicklungslandschaft weiterentwickelt.