How does the compilation/linking process work in C/C++?

The compilation of a C program involves several distinct phases that transform source code into an executable program. Understanding this process helps debug compilation errors and optimize build workflows.

Compilation Process Overview

Source Code (main.c) Preprocessor (main.i) Compiler (main.s) Assembler (main.o) Linker (executable)

Phase 1: Preprocessing

The preprocessor handles directives that begin with # symbol. It performs text substitution and file inclusion before actual compilation ?

#include <stdio.h>
#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
    printf("Value of PI: %.5f\n", PI);
    printf("Maximum of 10 and 20: %d\n", MAX(10, 20));
    return 0;
}
Value of PI: 3.14159
Maximum of 10 and 20: 20

The preprocessor expands #include directives by copying header file contents and replaces #define macros with their values.

Phase 2: Compilation

The compiler parses the preprocessed C code and converts it into assembly language. It performs syntax checking, semantic analysis, and optimization ?

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int result = add(5, 10);
    printf("Result: %d\n", result);
    return 0;
}
Result: 15

During compilation, the compiler generates assembly code and then converts it to object code containing machine instructions but with unresolved external references.

Phase 3: Linking

The linker combines object files and resolves external references to create the final executable. It links library functions like printf() ?

#include <stdio.h>
#include <math.h>

int main() {
    double number = 16.0;
    double square_root = sqrt(number);
    printf("Square root of %.1f is %.2f\n", number, square_root);
    return 0;
}
Square root of 16.0 is 4.00

Note: To compile programs using math functions, you may need to link the math library using -lm flag in some environments.

Compilation Phases Summary

Phase Input Output Function
Preprocessing .c file .i file Handle directives, macro expansion
Compilation .i file .s file Generate assembly code
Assembly .s file .o file Convert to machine code
Linking .o files executable Resolve references, create executable

Conclusion

The C compilation process transforms source code through preprocessing, compilation, assembly, and linking phases. Understanding these phases helps identify where compilation errors occur and how to resolve linking issues with external libraries.

Updated on: 2026-03-15T09:52:12+05:30

5K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements