Länkning av program

Det sista som sker då ett program kompileras är att det länkas, d.v.s. all kod skrivs ut till den slutgiltiga filen och diverse extra kod inkluderas. Denna extra kod har som uppgift att bl.a. starta programmet (se till att funktionen main() anropas) och se till att kod finns som kan anropa externa bibliotek (se Kapitel 11 för mera information om externa bibliotek). Om man alltsp använder sig av funktioner som finns i bibliotek som inte normalt används av kompilatorn måste man berätta vilka bibliotek som skall länkas in i det slutgiltiga programmet. Om detta inte görs vit kompilatorn inte i vilket bibliotek någon viss funktion finns, och programmet kan således inte köras. Istället ger kompilatorn en felmeddelande. Användaren skall då berätta åt kompilatorn med hjälp av diverse switchar -lbibliotek vilka bibliotek som skall användas.

Hur man vet vad ett bibliotek heter är lite knepigt. Om man vet att ett program använder funktioner från biblioteken /usr/lib/libMesaGL.so och /lib/libm skall man ge switcharna -lMesaGL och -lm. Var kommer då dessa namn ifrån? Jo, man skall från biliotekets filnamn lämna bort hela sökstigen och lib från början av filnamnet. Därefter skall man även lämna bort alla versionsnumror och .so som finns. Kvar blir bibliotekets basnamn. Det enare biblioteket, libm, är det normala matematikbiblioteket som innehåller funktioner som t.ex. sin(), log() och sqrt(). Om vi har ett program som heter Grafik.cpp som använder båda dessa biblioteken bör vi ge följande kommandorad:

% g++ Grafik.cpp -lMesaGL -lm
%

I detta fall är det skillnad i vilken ordning switcharna ges. Alla switchar som hör till länkingen av programmet måste komma sist på kommandoraden, efter alla -O, -Wall o.dyl.

Sökstig för bibliotek

Precis som för header-filer vet kompilatorn för det mesta var olika bibliotek finns på disken då det är dags att länka in dem, speciellt om man använder normala bibliotek som hör till kompilatorn. Om man dock har något speciellt bibliotek man använder som inte finns på ett ställe som kompilatorn söker på måste man berätta åt denna var det finns. Man vet att ett bibliotek inte hittas av att kompilatorn ger ett felmeddelande. Man använder flaggan -L för att ge en stig till en katalog där biblioteket finns. Denna flagga fungerar precis som -I fungerar för headerfiler (se avsnittet Sökstig för headerfiler). Vi antar att vi har ett bibliotek som heter libMesaGL som finns i katalogen /usr/X11R6/lib. Då används det på följande sätt:

% g++ GfxProgram.cpp -L/usr/X11R6/lib -lMesaGl
%

Nu vet kompilatorn var biblioteket finns, samt att det skall länkas in i programmet.

Biblioteksberoenden

För att göra saker och ting ännu mera krångliga då man länkar program är det även skillnad i vilken ordning man ger biblioteken! Detta kan vara väldigt förvirrande för någon som för första gången hanterar olika bibliotek. Tumregeln är att ett bibliotek som kallar på funktioner från ett annat måste komma längre till höger. I detta fall vet man att libMesaGL använder sig av matematik, så den kallar därför på funktioner från libm, varvid -lm skall komma till höger om -lMesaGL på kommandoraden. Så länge man har endast ett extern bibliotek är det ingen skillnad, men när man har tio eller mera kan det vara svårt att få dem i korrekt ordningsföljd. Lösningen på detta problem er erfarenhet och några praktiska verktyg som kan användas för att kontrollera biblioteks inbördes beroended (t.ex. ldd och nm).

Programmen i detta kompendium kräver dock endast i undantagsfall att man länkar in extra bibliotek, och i så fall är det fårgan om matematikbiblioteket libm. Alla program som använder sig av funktioner från math.h måste länka in matematikbiblioteket libm med hjälp av switchen -lm. Placera denna sist på kommandoraden.