#1 David Kolibřík
Jak si správně napsal, implementace funkcí z hlavičkových souborů jsou uloženy v knihovnách. Ty existují ve dvou podobách - staticky linkované a dynamicky linkované.
Staticky linkované se k výsledné binárce linkují v průběhu kompilace. Výhodou je v podstatě nezávislost na systémových knihovnách, nevýhodou větší velikost binárky (jsou v ní všechny fce knihovny).
Dynamicky linkované jsou trochu magie - do binárky se uloží vstupní bod do knihovny a takto se zkompiluje. Knihovna je potom sestavená tak, aby při spuštění programu nebyla závislá na umístění v paměti. Dynamický linker (na UNIX systémech většinou ldd) se poté postará o přilinkování kódu fcí za běhu programu. Výhodou je menší velikost binárky, menší paměťový footprint a možnost zajistit aktuální verzi knihovny pro všechny, kdo ji používají.
Jak se "hledají" funkce: překladač (konkrétně linker) většinou defaultně linkuje standardní knihovnu (na UNIXu libc), která mimo jiné většinou obsahuje tvoji fci printf(). Mnoho hlavičkových souborů dodávaných s překladačem používá standardní knihovnu. Jednou ze známých výjimek je např. math.h.
Pokud používám hlavičkový soubor, jehož funkce nejsou implementovány ve standardní knihovně, musím překladači explicitně sdělit, že ji chci přilinkovat. V případě math.h například linkuji libm (pro více informací doporučuji konzultovat manuál ke svému překladači/linkeru).
Překladač/linker také umožňuje nastavit adresáře s umístěním hlavičkových souborů/knihoven, více informací opět v manuálu.
Co se týče článku, docela pěkně vypadá tohle http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
#2 JoDiK
Opravdu, ale opravdu offtopic. Co má IDE společného se základními principy linkování knihoven?