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 namn |
Anger att den exekverbara modulen ska skrivas på filen namn, ej
på standardfilen
|
| -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 |
| -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 |
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 |
| -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 |
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
