gccAan de slag met gcc


Opmerkingen

GCC (hoofdletters) verwijst naar de GNU Compiler Collection. Dit is een open source compilatorsuite met compilers voor C, C ++, Objective C, Fortran, Ada, Go en Java. gcc (kleine letters) is de C-compiler in de GNU Compiler Collection. Historisch gezien zijn GCC en gcc door elkaar gebruikt, maar er worden pogingen gedaan om de twee termen te scheiden, aangezien GCC tools bevat om meer dan C te compileren.

Documentatie in deze sectie verwijst naar gcc, de GNU C-compiler. De bedoeling is om snel algemene acties en opties op te zoeken. Het GCC-project heeft gedetailleerde documentatie op https://gcc.gnu.org over de installatie, het algemene gebruik en elke opdrachtregeloptie. Raadpleeg de officiële GCC-documentatie voor vragen die hier niet worden beantwoord. Als een bepaald onderwerp onduidelijk is in de GCC-documentatie, vraag dan specifieke voorbeelden aan.

versies

Versie Publicatiedatum
7.1 2017/05/02
6.3 2016/12/21
6.2 2016/08/22
5.4 2016/06/03
6.1 2016/04/27
5.3 2015/12/04
5.2 2015/07/16
5.1 2015/04/22
4.9 2014/04/22
4.8 2013/03/22
4.7 2012-03-22
4.6 2011-03-25
4.5 2010-04-14
4.4 2009-04-21
4.3 2008-03-05
4.2 2007-05-13
4.1 2006-02-28
4.0 2005-04-20
3.4 2004/04/18
3.3 2003/05/13
3.2 2002/08/14
3.1 2002/05/15
3.0 2001/06/18
2.95 1999/07/31
2.8 1998/01/07
2.7 1995/06/16
2.6 1994/07/14
2.5 1993/10/22
2.4 1993/05/17
2.3 1992/10/31
2.2 1992/06/08
2.1 1992/03/24
2.0 1992/02/22
1.42 1992/09/20
1.41 1992/07/13
1.40 1991/06/01
1.39 1991/01/16
1,38 1990/12/21
1.37 1990/02/11
1.36 1989/09/24
1.35 1989/04/26
1.34 1989/02/23
1.33 1989/02/01
1.32 1988/12/21
1.31 1988/11/19
1.30 1988/10/13
1.29 1988/10/06
1.28 1988/09/14
1.27 1988/09/05
1.26 1988/08/18
1.25 1988/08/03
1.24 1988/07/02
1.23 1988/06/26
1.22 1988/05/22
1.21 1988/05/01
1.20 1988/04/19
1.19 1988/03/29
1.18 1988/02/04
1.17 1988/01/09
1.16 1987/12/19
1.15 1987/11/28
1.14 1987/11/06
1.13 1987/10/12
1.12 1987/10/03
1.11 1987/09/05
1.10 1987/08/22
1.9 1987/08/18
1.8 1987/08/10
1.7 1987/07/21
1.6 1987/07/02
1.5 1987/06/18
1.4 1987/06/13
1.3 1987-06-10
1.2 1987/06/01
1.1 1987/05/24
1.0 1987/05/23
0.9 1987/03/22

"Hallo Wereld!" met gemeenschappelijke opdrachtregelopties

Voor programma's met één bronbestand is het gebruik van gcc eenvoudig.

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}
 

Om het bestand hello_world.c vanaf de opdrachtregel te compileren:

gcc hello_world.c
 

gcc compileert vervolgens het programma en voert het uitvoerbare bestand uit naar het bestand a.out. Als u het uitvoerbare bestand een naam wilt geven, gebruikt u de optie -o.

gcc hello_world.c -o hello_world
 

Het uitvoerbare bestand krijgt dan de naam hello_world in plaats van a.out. Standaard zijn er niet zoveel waarschuwingen die door gcc worden afgegeven. gcc heeft veel waarschuwingsopties en het is een goed idee om de documentatie van gcc te bekijken om te weten te komen wat beschikbaar is. Het gebruik van '-Wall' is een goed uitgangspunt en omvat veel voorkomende problemen.

gcc -Wall hello_world.c -o hello_world
 

Output:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^
 

Hier zien we dat we nu een waarschuwing krijgen dat de variabele 'i' is gedeclareerd maar helemaal niet in de functie is gebruikt.

Als u van plan bent om een foutopsporing te gebruiken voor het testen van uw programma, moet u gcc vertellen om foutopsporingsinformatie op te nemen. Gebruik de optie '-g' voor ondersteuning voor foutopsporing.

gcc -Wall -g hello_world.c -o hello_world
 

hello_world heeft nu foutopsporingsinformatie ondersteund door GDB. Als u een andere foutopsporing gebruikt, moet u mogelijk verschillende foutopsporingsopties gebruiken zodat de uitvoer correct wordt opgemaakt. Raadpleeg de officiële gcc-documentatie voor meer foutopsporingsopties.

Standaard compileert gcc code zodat deze eenvoudig te debuggen is. gcc kan de uitvoer optimaliseren, zodat het uiteindelijke uitvoerbare bestand hetzelfde resultaat oplevert, maar snellere prestaties heeft en kan resulteren in een kleiner uitvoerbaar bestand. De optie '-O' maakt optimalisatie mogelijk. Er zijn verschillende erkende kwalificaties om toe te voegen na de O om het optimalisatieniveau op te geven. Elk optimalisatieniveau voegt een set lijst met opdrachtregelopties toe of verwijdert deze. '-O2', '-Os', '-O0' en '-Og' zijn de meest gangbare optimalisatieniveaus.

gcc -Wall -O2 hello_world.c -o hello_world
 

'-O2' is het meest voorkomende optimalisatieniveau voor productieklare code. Het biedt een uitstekende balans tussen prestatieverhoging en uiteindelijke uitvoerbare grootte.

gcc -Wall -Os hello_world.c -o hello_world
 

'-Os' is vergelijkbaar met '-O2', behalve dat bepaalde optimalisaties die de uitvoersnelheid kunnen verhogen door de uitvoerbare grootte te vergroten, zijn uitgeschakeld. Als de uiteindelijke uitvoerbare grootte belangrijk voor u is, probeer dan '-Os' en kijk of er een merkbaar grootteverschil is in het uiteindelijke uitvoerbare bestand.

gcc -Wall -g -Og hello_world.c -o -hello_world
 

Merk op dat in de bovenstaande voorbeelden met '-Os' en '-O2' de optie '-g' is verwijderd. Dat komt omdat wanneer u de compiler begint te vertellen om de code te optimaliseren, bepaalde regels code in wezen mogelijk niet meer bestaan in het uiteindelijke uitvoerbare bestand, waardoor debuggen moeilijk wordt. Er zijn echter ook gevallen waarin bepaalde fouten alleen optreden wanneer optimalisaties zijn ingeschakeld. Als u uw toepassing wilt debuggen en de compiler de code wilt laten optimaliseren, probeer dan de optie '-Og'. Dit vertelt gcc om alle optimalisaties uit te voeren die de debugging-ervaring niet mogen belemmeren.

gcc -Wall -g -O0 hello_world.c -o hello_world
 

'-O0' voert nog minder optimalisaties uit dan '-Og'. Dit is het optimalisatieniveau dat gcc standaard gebruikt. Gebruik deze optie als u zeker wilt zijn dat optimalisaties zijn uitgeschakeld.

Bepaal de gcc-versie

Wanneer u naar de documentatie van gcc verwijst, moet u weten welke versie van gcc u gebruikt. Het GCC-project heeft een handleiding voor elke versie van gcc met functies die in die versie zijn geïmplementeerd. Gebruik de optie '-v' om te bepalen welke versie van gcc u gebruikt.

gcc -v
 

Voorbeelduitvoer:

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
 

In dit voorbeeld zien we dat we gcc-versie 5.3.1 gebruiken. U zou dan weten dat u de GCC 5.3-handleiding moet raadplegen. Het is ook nuttig om uw gcc-versie op te nemen bij het stellen van vragen voor het geval u een versiespecifiek probleem hebt.