Program może składać się z wielu plików C/CPP, ale tylko w jednym może wystąpić funkcja main. Budowanie programu ze źródeł składa się z dwóch głównych etapów :
- oddzielnej kompilacji każdego pliku .c/.cpp w wyniku czego powstają pliki .o/.obj. Jeśli w jednym pliku .c wywoływana jest funkcja w nim nieobecna kompilator "zostawia puste miejsce" oznaczając jaka funkcja na zostać tam wywołana. Dodatkowo oznaczona jest gdzie zaczynają się poszczególne funkcje zdefiniowane w danym pliku.
- Połączenia powstałych plików .o/.obj w jeden plik .exe. (dochodzą jeszcze biblioteki) Połączenie polega na takim prosty zsumowaniu kodu z plików .o(bj) a następnie wypełnieniu wszystkich "pusty miejsc" - linker (tak nazywa się program realizujący ten etap) patrzy jaka funkcje ma być wywołąna, potem szuka tej funkcji w połączonym kodzie i wpisaniu odpowiedniego adresu w puste miejsce.
Wynika z tego, że w całym połączonym kodzie może być tylko jedna funkcja o danej nazwie. Do tyczy to też funkcji main. W uproszczeniu można uznać, że pliki .c/.cpp zawierające funkcję main to program, te bez funkcji main to biblioteki - po prostu zestaw funkcji do wykorzystania w innych plikach.
Oczywiście różne kombajny do języka C mogą wiele z tych operacji ukryć przed użytkownikiem. Nawet gcc to taki kombajn korzystający z innych programów - przynajmniej tak było dawniej.