Hur bibliotek fungerar

Bibliotek används både då program kompileras och då de körs. Man måste berätta åt kompilatorn från vilka bibliotek man har använt funktioner och kompilatorn sköter sedan om att dessa bibliotek används av programmet då det körs. Vid kompileringsskedet kontrolleras alla funktioner som kommer från något externt bibliotek och kod genereras för att kunna anropa dessa funktioner då programmet körs. Man brukar säga att bilioteket dynamiskt länkas in i programmet. Då programmet sedan körs laddas först själv programmet in, därefter bibliotek som programmet använder. Om andra program redan använder samma bibliotek finns de redan färdigt inladdade i minnet. Man talar om att ett bibliotek är delat (shared). Alla program som kör samtidigt delar samma instans av ett bibliotek, så det finns inläst endast en gång i minnet. Detta leder till mera minnessnåla program, eftersom en stor del av koden kan delas mellan olika program som kör samtidigt.

Så gott som alla program som verkligen gör något använder sig av ett eller flera bibliotek. Ibland använder ett bibliotek ett annat bibliotek, så ett program kan, utan att veta det, använda ett stort antal olika bibliotek. I de flesta fall behöver man egentligen inte veta detta, utan endast då man explicit vill använda funktioner ur ett extra bibliotek, t.ex. då man använder OpenGL, måste man berätta åt kompilatorn vilket bibliotek som skall användas.

Figur 11-1. Länkning av bibliotek vid körning

Bilden ovan illustrerar hur exempel-biblioteken c, g++ och math länkas in då hello körs. De fungerar sedan som en del av programmet under den tid det körs.

Bibliotek och header-filer

För att programmerare skall veta vilka funktioner som finns i olika bibliotek har man inom C++-världen traditionellt använt någonting som kallas header-filer. Dessa är filer som innehåller olika definitioner, funktionsprototyper m.m., och som kan användas av program. En header-fil berättar vad som finns i biblioteket och vad som kan användas. Utan header-filer (och dokumentation för biblioteken) är det mycket svårt att veta vad som finns i ett bibliotek. Ett program kan uttrycka en önskan att använda funktioner från ett bibliotek genom att ha en eller flera #include-deklarationer någonstans i programmet. Ofta finns det flera olika header-filer för ett bibliotek, men ett program kanske endast behöver inkludera en av dessa, beroende på vilka funktioner eller definitioner som önskas.

De program vi hittills skapat har i de flesta fall inkluderat headerfilen iostream. Denna headerfil är en C++-headerfil och innehåller de flesta definitioner vi har behövt för att hantera I/O. Vissa funktioner har inte funnits i denna header-fil, så då har även iomanip inkluderats. Båda dessa header-filer definierar funktioner som finns i bibliotek som automatiskt används (se avsnittet Exempelbibliotek).