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 namn |
Den exekverbara modulen ska skrivas på filen namn, ej
på defaultfilen
|
-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 |
-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 |
-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 |
-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 |
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/gccfiltereller 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