Göm menyn

GNU GCC C++ på IDAs undervisningssystem

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 (flaggor) 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.

Se även Lokala länkproblem för GCC och deras lösning 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

Länkning görs ej. För varje källkodsfil skapas i stället en .o-fil med objektkod. Används till exempel då man kompilerar programkod som saknar funktionen main.

-o namn

Den exekverbara modulen ska skrivas på filen namn, ej på defaultfilen a.out.

-g

Programmet ska kompileras för att köras avlusare (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 ska avlusas kompileras med -g.

-std=c++11    

Kompilering för ISO C++11 (default är för närvarande C++98).

-std=c++1y    

Experimentella tillägg för nästa revision av standarden för C++ (C++14) görs tillgängliga, se C++14.

-Wpedantic

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

-Wall

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

-Wextra

Mer kontroller utöver -Wall, till exempel varnas för semikolon som i "if (e) ;".

-Werror

Warningar betraktas som fel,inget körbart program erhålls om varningar förekommer.

Du bör alltid använda -Wpedantic, -Wall, -Wextra och -Werror. Detta fångar en hel del som annars inte meddelas men som kan innebära fatala fel i programmet. Ett program kan inte anses korrekt om varningar förekommer. Följande kommando innebär att hello.cc kompileras för avlusning, "petigt" och att det körbara programmet erhålls på filen hello men endast om inga varningar utfärdas:

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

För att slippa skriva så långa kommandon kan du skapa alias, se Kommandoalias nedan.

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

-I pathname    

pathname läggs till i listan av filkataloger där inkluderingsfiler ska sökas. Flera -I-direktiv kan ges. Preprocessorn söker först i arbetskatalogen, sedan i dekataloger som anges med -I, och sist i de defaultkataloger som alltid genomsöks.

-L directory

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

-l lib

Länkning ska göras med biblioteket lib (görs av ld). Om inte lib ligger i defaultsö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++.

Länkproblem på IDAs solarissystem 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 -Wpedantic, -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 (här med alla flaggor som man normalt bör/måste använda).

   gccfilter -c -a g++ -std=c++11 -Wpedantic -Wall -Wextra -Werror -L/sw/gcc-${GCC4_V}/lib -static-libstdc++ hello.cc

På IDAs Linuxsystem måste en motsvarande modul laddas, antingen i ett enskilt terminalfönster med kommandot

   module add prog/gccfilter
eller i inloggningsmiljön med kommandot
   module initadd prog/gccfilter

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.

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.

Se även GCC, the GNU Compiler Collection.

Mer information om kompilatorer för olika plattformar

Se The home of Standard C++ on the web: Get a Compiler

Kommandoalias

Som framgått ovan kan man behöva ge långa kommandon på grund av alla flaggor man vill/måste ange. För att underlätta abetet kan man med fördel definiera ett eller flera alias i sin ~/.cshrc (~/.cshrc.private på IDA) eller motsvarande för andra kommandotolkar (.cshrc är för C Shell). Följande rader definierar aliasen g++ och g++filter till att även inbegripa flaggorna som definieras av variablerna CCFLAGS (kompileringsflaggor) och LDFLAGS (länkningsflaggor):

   set CCFLAGS="-std=c++11 -Wpedantic -Wall -Wextra -Werror"
   # Note the use of single quotes to prevent (delay) expansion of ${GCC4_V}
   set LDFLAGS='-L/sw/gcc-${GCC4_V}/lib -static-libstdc++'
   alias g++ "g++ ${CCFLAGS} ${LDFLAGS}"
   alias g++filter "gccfilter -a -c g++ ${CCFLAGS} ${LDFLAGS}"

Det enkla kommandot g++ hello.cc blir nu detsamma som

  g++ -std=c++11 -Wpedantic -Wall -Wextra -Werror -L/sw/gcc-${GCC4_V}/lib -static-libstdc++ hello.cc

och motsvarande för kommandot g++filter hello.cc.


Sidansvarig: UPP-gruppen
Senast uppdaterad: 2015-10-06