Göm menyn

C++-kompilatorer på IDAs Sun-system

På IDA:s Sun-system finns två system för C++, GNU GCC och Sun CC. Eftersom GCC-kompilatorn g++ är den som främst används i kurser håller vi oss till den här.

Att sätta upp GCC i din miljö

För att kunna använda g++ och avlusaren gdb ska modulen prog/gcc laddas. Detta är default på IDA men defaultversionen av gcc måste för närvarande bytas mot en senare för att få tillgång till så mycket som möjligt då det gäller C++11. Det enklaste är att placera nedanstående rader i filen .login i din hemkatalog (och sedan logga ut och in). Detta med för att den senaste versionen av GCC 4 som är tillgänglig på IDA automatiskt laddas vid inloggning.

   module rm prog/gcc
   module add prog/gcc/4

Observera, dessa rader måste placeras efter det module add-kommando som redan finns i början av .login.

I och med detta sätts även miljövariabeln GCC4_V. Den kan användas i make-filer och i andra sammanhang där man behöver referera till aktuell version av GCC.

Anm: för att ta reda på vilka moduler du har laddade, ge kommandot module list.

Kompilering och länkning med GCC

De flesta C++-kompilatorer accepterar filer med suffix .cc, .C, .c, .cp, .cpp, .c++ och .cxx som källkodsfiler skrivna i C++. Filer med suffix .o innehåller objektkod som kan ges direkt till länkaren, ld. Observera, att även om man enbart har .o-filer som ska länkas ska man använda kommandot g++ för att ge länkkommandon, ej ld. Detta för att erhålla rätt länkmiljö.

Då man ger kommandot g++ utan några väljare som bestämmer annorlunda, till exempel

   % g++ hello.cc 

utförs alla översättningssteg från källkod till körbart program och man erhåller (om inga fel detekteras) en exekverbar fil med namnet a.out. Med väljare ("options") kan man styra mer i detalj hur översättningen ska utföras.

Felutskrifter kan vara omfattande och svåra att läsa och tolka, speciellt när fel uppstår som berör kod som anvsänder mallar (och det är mer än man kanske tror som gör det). gccfilter är installerat för att underlätta, se nedan.

Det finns ett stort antal väljare som kan anges i kompilerings- och länkkommandon. De normalt främst användbara väljarna är:

-c

Anger att länkning ej ska göras. För varje källkodsfil skapas i stället en .o-fil som innehåller objektkod. Denna väljare används till exempel då man kompilerar programkod som ej omfattar ett huvudprogram (dvs saknar funktionen main).

-o namn

Anger att den exekverbara modulen ska skrivas på filen namn, ej på standardfilen a.out.

-g

Anger att programmet ska kompileras för att köras med avlusaren (debugger), dvs göra det möjligt att köra program under kontroll, till exempel en rad i taget, till en brytpunkt man satt, etc. Om programmet består av flera källkodsfiler måste alla delfiler som man vill kunna avlusa kompileras med -g.

-std=c++11    

Tar bort tillägg i GNU som är i konflikt med ISO-standarden för C++ (2011).

-pedantic

Alla varningar som krävs av strikt standard (ISO) C++ skrivs ut.

-Wall

Medför att varningar om alla ifrågasättbara konstruktioner skrivs ut. Normalt varnas endast för programkonstruktioner som med största säkerhet innebär problem.

-Wextra

Lite mer kontroller än -Wall, till exempel varnas för semikolon som i "if (e) ;".

Du bör alltid använda -pedantic, -Wall och -Wextra. Detta fångar en hel del som annars inte meddelas men som kan medföra fatala fel i programmet. Följande kommando innebär att hello.cc ska kompileras för avlusning, "petigt" och att det körbara programmet önskas på filen hello:

   % g++ -g -std=c++11 -pedantic -Wall -Wextra -o hello hello.cc

För att slippa skriva så långa kommandon kan du skapa ett alias men mer om detta på nästa sida.

Följande väljare kan användas för att inkludera och länka kod som ej finns i standardsökvägar (det ska inte vara något mellanrum i väljarna):

-I pathname    

(stora i) Lägger till pathname till listan av filkataloger i vilka sökning efter inkluderingsfiler ska göras. Flera -I-direktiv kan ges i ett kommando. Preprocessorn söker först i arbetskatalogen, sedan i de filkataloger som anges med -I, och sist i de standardfilkataloger som alltid genomsöks av preprocessorn.

-L directory

Lägger till directory till sökvägen för filkataloger som innehåller bibliotek med länkbar objektkod (länkas av ld).

-l lib

(lilla "el") Länkning ska göras med biblioteket lib (görs av ld). Om inte lib ligger i standardsökvägen måste denna väljare kombineras med -L, se ovan. Väljaren -l måste ges efter en del anndra väljade.

För mer information om dessa och om övriga väljare som kan ges till g++, se manualsidan för g++.

Lokala länkproblem för GCC och deras lösning

För närvarande är det problem med aktuell version av solarissystemet på IDA och C++ länkbibliotek, som gör att man kan få länkfel. Detta kan lösas med väljarna -L/sw/gcc-$GCC4_V/lib och -static-libstdc++. Följande alias därför vara en god idé att lägga till i filen .cshrc.private i hemkatalogen (-std=c++11 har nämnts tidigare, liksom Väljarna -pedantic, -Wall och -Wextra, vilka kan man vilja experimentera med och därför inte bör ha med i detta alias):

   alias g++ "g++ -std=c++11 -L/sw/gcc-${GCC4_V}/lib -static-libstdc++"

Detta sparar låtminstone en del knappande och för övrigt kan man ju dra nytta av kommandohistoriken i terminalfönstren då man vill upprepa kommandon.

gccfilter

Hjälpmedelet gccfilter rekommenderas starkt. Använder du det kommer felutskrifterna från kompilatorn att bli betydligt lättare att läsa. Exempel på användning, lägg bara till "gccfilter -c -a" före det g++-kommando du annars skulle ge.

   gccfilter -c -a g++ -pedantic -Wall -Wextra hello.cc

Kompilering av mallar med GCC

All kod för mallar (template) måste inkluderas i de filer som använder mallkoden. Om man till exempel har en klassmall på en inkluderingsfil (.h) och en tillhörande implementeringsfil (.tcc) är det lämpligt att låta inkluderingsfilen allra sist inkludera implementeringsfilen. Då kan program som använder klassmallen, som normalt, inkludera endast inkluderingsfilen. Även inkluderingsfilen bör i detta fall ha en inkluderingsgard.

Mer information om GCC

Se direkthjälpen för g++ och gcc (kommandot man g++, alt. man gcc i ett terminalfönster) och den info-dokumentation som kan läsas med Emacs (kommandot M-X info i Emacs.). Anvisningar för hur man läser info i Emacs och vilken information som finns, finns i dokumentationen. Om man har en menylist i emacsfönstret hittar man även där hjälpmedel för att navigera i info-dokumenten.


Sidansvarig: UPP-gruppen
Senast uppdaterad: 2013-03-26