Hur man använder gcc för att kompilera ett C program
Postat: 07 nov 2006, 16:41
Att kompilera ett C program är inte särskilt svårt.
För att kompilera detta program om vi antar att filen med programmet heter hello.c
Så skriver man bara detta i skalet (man måste då vara i samma mapp som filen hello.c):
Detta kommer att skapa en fil som heter a.out som man sedan kan köra.
Om man nu vill att programmet ska heta något annat så kan man antigen bara byta namn på filen eller använda flaggan -o
kommer att skapa en körbar fil precis som a.out fast den heter nu istället hello.
För att göra exemplet lite mer avancerat så blandar vi in en till fil. Om vi har två filer en som heter hello.c och en som heter print.c
Så nu har vi kod i två stycken filer. För att kompilera detta exempel så skriver man bara
Vilket skapar filen hello.
Om man ska använda sig att ett bibliotek så måste man länka detta bibliotek. Om vi ska kompilera det här programmet som använder sig av Math biblioteket så måste man säga till gcc att länka mot det.
Det räckar alltså inte bara att inkludera math.h header-filen.
Här ser man vilket fel man får när man inte länkar.
Alltså för att länka mot ett bibliotek så använder man flaggan -l och för att länka matte biblioteket -lm för att länka mot t.ex. xlib så använder man sig av -lX11 osv...
För att länka mot ett bibliotek som inte finns i någon standard mapp så kan man använda flaggan -L/sökväg/ samma sak gäller för header-filer om man anger -I/sökväg så kommer gcc att söka efter headerfiler i denna mapp också.
Två andra flaggar som också är användbara är:
-D och -g.
-D används för att definiera ett värde, te.x. om vi har denna kod
och kompilerar den med
så kommer programmet att skriva ut
hello world
men om det kompileras med flaggan -DAGAIN
så skriver programmet ut
hello world
hello world again!
Detta är _väldigt_ smidigt om man vill ha spårutskrifter ibland och ibland inte.
Flaggan -g kommer att skapa en körbar binär som är kompilerad för debuggning. Vilket innebär att man kan använda gdb för att stega igenom koden under exekveringen.
Flaggarn -Wall är mycket bra att använda när man skriver program då denna ger mera varningar!
Så när jag kompilerar xwmpager så använder jag dessa flaggor.
För att kompilera detta program om vi antar att filen med programmet heter hello.c
Kod: Markera allt
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
Kod: Markera allt
gcc hello.c
Kod: Markera allt
./a.out
hello world
Kod: Markera allt
gcc hello.c -o hello
För att göra exemplet lite mer avancerat så blandar vi in en till fil. Om vi har två filer en som heter hello.c och en som heter print.c
Kod: Markera allt
hello.c ser ut såhär
#include <stdio.h>
void print_hello();
int main() {
printf("hello world\n");
print_hello();
return 0;
}
print.c ser ut såhär
#include <stdio.h>
void print_hello() {
printf("hello world, again...\n");
}
Kod: Markera allt
gcc hello.c print.c -o hello
Kod: Markera allt
./hello
hello world
hello world, again...
Kod: Markera allt
#include <math.h>
#include <stdio.h>
int main() {
printf("sin(0.5)%f\n",sinf(0.5));
return 0;
}
Kod: Markera allt
gcc math.c -o sinus
/tmp/cc4BKYrc.o: In function `main':
math.c:(.text+0x1a): undefined reference to `sinf'
collect2: ld returned 1 exit status
Exit 1
Kod: Markera allt
gcc -lm math.c -o sinus
./sinus
sin(0.5)0.479426
För att länka mot ett bibliotek som inte finns i någon standard mapp så kan man använda flaggan -L/sökväg/ samma sak gäller för header-filer om man anger -I/sökväg så kommer gcc att söka efter headerfiler i denna mapp också.
Två andra flaggar som också är användbara är:
-D och -g.
-D används för att definiera ett värde, te.x. om vi har denna kod
Kod: Markera allt
#include <stdio.h>
int main() {
printf("hello world\n");
#ifdef AGAIN
printf("hello world again!\n");
#endif
return 0;
}
Kod: Markera allt
gcc def.c -o def
hello world
men om det kompileras med flaggan -DAGAIN
Kod: Markera allt
gcc -DAGAIN def.c -o def
hello world
hello world again!
Detta är _väldigt_ smidigt om man vill ha spårutskrifter ibland och ibland inte.
Flaggan -g kommer att skapa en körbar binär som är kompilerad för debuggning. Vilket innebär att man kan använda gdb för att stega igenom koden under exekveringen.
Flaggarn -Wall är mycket bra att använda när man skriver program då denna ger mera varningar!
Så när jag kompilerar xwmpager så använder jag dessa flaggor.
Kod: Markera allt
gcc -lX11 -Wall -I. -std=gnu99 main.c drawing.c xcomm.c -o xwmpager