Na OK, akkor linkelés:
Van egy library, mindegy, hogy statikus, vagy dinamikus, ami egy lefordított bináris cucc.
A library-hoz tartozik header file, ami gyakorlatilag felsorolja, hogy mik azok, amiket te kívülről látsz.
A programodba beincludeolod a headert, ezzel a fordítás rész lemegy.
Fordítás után az objekt fájlokból még valami futtathatót kell linkelned (ezt a gcc megcsinálja, akár egy parancsra is, de akkor is külön lépés).
Amikor linkelsz, akkor meg kell mondani, hogy melyik statikus libet (könyvtár.a), vagy dinamikus libet (könyvtár.so) akarod a programhoz linkelni.
Ha statikusan linkelsz egy objektumot, akkor abból amit a programod használ, azt hozzámásolja a végtermékhez, és amikor a programod fut, akkor a fájlon belül megtalálja.
Ha dinamikusan linkelsz, akkor csak eltárolja a fájlnevet, és amikor a programot elindítod, akkor a dinamikus linker megpróbálja megkeresni neked azt a fájlt, amit fordításkor adtál meg neki. Ha nem található, hibaüzenetet kapsz, ha megvan, betölti, és induláskor térképezi fel, hogy akkor az adott függvény hol található.
Ehhez neked program írása közben nem kell figyelned, mindegy, hogy a függvényt te írtad egy másik forrásfájlban vagy valaki más, és te csak a libet használod, a szintaktika ugyanaz.
Emellett még lehet futás közben is megnyitni dinamikus libet, és megkeresni benne szimbólumot, majd oda ugrani, de szerintem neked most nem ez kell. Ez akkor lehet érdekes, ha mondjuk menet közben betölthető és cserélhető modult készítesz, plugint, ilyesmit.