Evo reda iz stdio.h
Code:
extern int printf (__const char *__restrict __format, ...);
Dakle heder kaže, postoji neka EKSTERNA funkcija printf koja ima takve i takve argumente. Dakle, da bi se napravio izvršni kod od tvoje funkcije, linker zna da treba da ulinkuje neku biblioteku koja sadrži implementaciju funkcije printf.
Po defaultu, hederi se nalaze u /usr/include, a ako imaš još neke nestandardne hedere onda -I<folder> kaže kompajleru da traži dodatne hedere u tom katalogu.
Slično, biblioteke se nalaze u /usr/lib, a ako treba da traži biblioteke na drugim mestima, staviš -L<folder>. Ovo samo kaže u kom folderu da traži biblioteke. Dodatno, biblioteku uključuješ u kod sa -l<ime biblioteke>
Neki kompajleri i okruženja ne moraju da uključe čak ni heder u tvoj sors jer drže već iskompajlirane verzije hedera na nekom mestu.
Isto tako radiš i kada pišeš neke svoje biblioteke. Napraviš .h sa PROTOTIPOVIMA tvojih funkcija, pa onda neke druge programe linkuješ sa svojim bibliotekama.