CS107 C-programma’s compileren met GCC

Geschreven door Chris Gregg, met aanpassingen door Nick Troccoli

Klik hier voor een walkthrough video.

De compiler die we voor CS107 zullen gebruiken heet de “GNU Compiler Collection” (gcc). Het is een van de meest gebruikte compilers, en het is zowel Vrije Software, als beschikbaar op veel verschillende computer platforms.

gcc voert de compilatie stap uit om een programma te bouwen, en dan roept het andere programma’s aan om het programma te assembleren en om de samenstellende delen van het programma te koppelen tot een uitvoerbaar programma dat je kunt uitvoeren. We zullen in CS107 meer leren over elk van deze stappen, maar het mooie is dat gcc met één commando het hele uitvoerbare (runnable) programma voor je kan maken.

In CS107 zullen we voornamelijk Makefiles gebruiken om onze code te compileren, assembleren en linken, maar de Makefile voert gcc uit om het werk te doen. This is just a quick overview on how to compile and run your own programs should you decide to do so without a Makefile.

The simplest way to run gcc is to provide gcc a list of .c files:

$ gcc hello.c$

Note that you do not put header files (.h) into the gcc command: it reads in the header files as it compiles, based on the #include statements inside .c files.

If the program compiled without errors or warnings, you don’t get any output from gcc, and you will have a new file in your directory, called a.out. To run this file, you need to tell the shell to run the file in the current directory, by using ./ before the name:

$ ./a.outHello, World!$

Wij willen over het algemeen niet dat onze programma’s a.out heten, dus u kunt gcc een optie geven, -o programName, om te vertellen hoe het uit te voeren bestand moet heten:

$ gcc hello.c -o hello$ ./helloHello, World!$

Note: wees voorzichtig dat je niet per ongeluk een runnable file naam invoert die hetzelfde is als je input file – zoiets als:

$ gcc hello.c -o hello.c

Op myth, is je profiel ingesteld om de fout op te vangen en niet te compileren, zodat je source file intact blijft. Dit is niet het geval op veel andere Linux systemen, dus wees voorzichtig! Op andere systemen zou GCC uw bronbestand overschrijven met het nieuwe uitvoerbare bestand.

gcc neemt veel verschillende commandoregel opties (vlaggen) die zijn gedrag veranderen. Een van de meest voorkomende vlaggen is de vlag “optimalisatieniveau”, -O (hoofdletter “o”). gcc heeft de mogelijkheid om uw code voor verschillende situaties te optimaliseren.

  1. -O of -O1: Optimaliseren. Het optimaliseren van de compilatie kost iets meer tijd, en veel meer geheugen voor een grote functie. Met -O probeert de compiler de code te verkleinen en de uitvoeringstijd te verkorten, zonder optimalisaties uit te voeren die veel compilatietijd kosten.
  2. -O2: Optimaliseer nog meer. GCC voert bijna alle ondersteunde optimalisaties uit die geen afweging tussen ruimte en snelheid met zich meebrengen. In vergelijking met -O, verhoogt deze optie zowel de compilatietijd als de prestaties van de gegenereerde code.
  3. -O3: Optimaliseer nog meer. -O3 schakelt alle optimalisaties in die zijn opgegeven door -O2 en schakelt ook andere optimalisaties in. Dit is vaak de beste optie om te gebruiken.
  4. -O0: Verkort de compilatietijd en laat debugging de verwachte resultaten opleveren. Dit is de standaardinstelling.
  5. -Os: Optimaliseren voor grootte. -Os schakelt alle -O2 optimalisaties in die de code normaal gesproken niet groter maken. Het voert ook verdere optimalisaties uit die zijn ontworpen om de code te verkleinen.
  6. -Snel: Negeer strikte naleving van standaarden. -Ofast maakt alle -O3 optimalisaties mogelijk. Het schakelt ook optimalisaties in die niet geldig zijn voor alle programma’s die aan de standaard voldoen.
  7. -Og: Optimaliseer debug ervaring. -Og maakt optimalisaties mogelijk die het debuggen niet hinderen. Het zou het optimalisatieniveau van keuze moeten zijn voor de standaard edit-compile-debug cyclus, die een redelijk niveau van optimalisatie biedt met behoud van snelle compilatie en een goede debug-ervaring. We zullen -Og in CS107 gebruiken als we aan het debuggen zijn.

Zie de man pagina voor gcc voor meer details over optimalisatie (of zie hier voor meer informatie over optimalisaties).

Een andere veelgebruikte vlag is de -std=gnu99 optie, die gcc vertelt om de “gnu c versie van de 1999 c standaard” te gebruiken. De standaard voorziet in syntax zoals de mogelijkheid om een variabele te definiëren binnen een for-lus verklaring (b.v., for (int i = ...). We zullen deze standaard gebruiken in CS107.

We zullen ook de -g vlag gebruiken, die ons in staat stelt om de debugger, gdb, te gebruiken om ons exacte regelnummers te geven in onze code wanneer we die uitvoeren.

Exemplaar:

$ gcc -std=gnu99 -g -Og loop.c -o loop 

Als u geïnteresseerd bent in nog meer informatie over gcc, bekijk dan Paragraaf 1 van dit Stanford Unix Programming Tools document, en ook de volledige gcc handleiding(GNU).