Sida 1 av 1

Hur man använder gcc för att kompilera ett C program

Postat: 07 nov 2006, 16:41
av Okänd
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

Kod: Markera allt

#include <stdio.h>

int main() {
   printf("hello world\n");
   return 0;
}
Så skriver man bara detta i skalet (man måste då vara i samma mapp som filen hello.c):

Kod: Markera allt

 gcc hello.c
Detta kommer att skapa en fil som heter a.out som man sedan kan köra.

Kod: Markera allt

./a.out
hello world
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

Kod: Markera allt

gcc hello.c -o hello
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

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");
}
Så nu har vi kod i två stycken filer. För att kompilera detta exempel så skriver man bara

Kod: Markera allt

 
gcc hello.c print.c -o hello
Vilket skapar filen hello.

Kod: Markera allt

./hello
hello world
hello world, again...
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.

Kod: Markera allt

 
#include <math.h>
#include <stdio.h>

int main() {
   printf("sin(0.5)%f\n",sinf(0.5));
   return 0;
}
Det räckar alltså inte bara att inkludera math.h header-filen.

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
Här ser man vilket fel man får när man inte länkar.

Kod: Markera allt

gcc -lm math.c -o sinus


./sinus 
sin(0.5)0.479426
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

Kod: Markera allt

#include <stdio.h>

int main() {
   printf("hello world\n");
#ifdef AGAIN
   printf("hello world again!\n");
#endif
   return 0;
}
och kompilerar den med

Kod: Markera allt

 
gcc def.c -o def
så kommer programmet att skriva ut
hello world
men om det kompileras med flaggan -DAGAIN

Kod: Markera allt

gcc -DAGAIN def.c -o def
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.

Kod: Markera allt

gcc -lX11 -Wall -I. -std=gnu99 main.c drawing.c xcomm.c -o xwmpager

Hur man använder gcc för att kompilera ett C program

Postat: 07 nov 2006, 18:22
av Okänd
För små enfilsprogram tycker jag att make är enklare.

Istället för att skriva

Kod: Markera allt

gcc hello.c -o hello
skriv

Kod: Markera allt

make hello

Hur man använder gcc för att kompilera ett C program

Postat: 07 nov 2006, 21:37
av Simon Eriksson
funkar detta för c++ program också? fick något skumt gcc fel förra gången jag försökte kompilera ett c++ program, ska säga att det var ett tag sen, och kommer inte ihåg felkoderna.

Hur man använder gcc för att kompilera ett C program

Postat: 07 nov 2006, 21:43
av Okänd
jo det ska inte vara några problem att kompilera C++ program med gcc.

Hur man använder gcc för att kompilera ett C program

Postat: 10 nov 2006, 18:57
av MdaG
Ska du kompilera C++ kod är det bättre att använda g++ som är gjort för att parsa klasser m.m.

Hur man använder gcc för att kompilera ett C program

Postat: 03 dec 2006, 01:10
av mans
Jag får ett lite märkligt fel när jag försöker kompilera c-progam med hjälp av terminalen i min splitternya Ubuntu-installation (var Windows-användare fram tills imorse...)

Så här ser det ut:

Kod: Markera allt

mans@Korona:~$ cat world.c
#include <stdio.h>

int main() {
        printf("hej världen");
        return 0;
}
mans@Korona:~$ gcc world.c
world.c:1:19: error: stdio.h: Filen eller katalogen finns inte
world.c: In function ‘main’:
world.c:4: warning: incompatible implicit declaration of built-in function ‘printf’
Jag trodde att alla standard c-bibliotek följde med Linux redan från början...? Mycket tacksam för hjälp!

Hur man använder gcc för att kompilera ett C program

Postat: 03 dec 2006, 05:43
av Okänd
tyvärr så följer inte alla build paket med ubuntu som standard :(


Ladda hen och installera build-esentials så borde det lösa sig

Hur man använder gcc för att kompilera ett C program

Postat: 03 dec 2006, 11:19
av mans
Nu funkar det :) Tack för hjälpen!

Hur man använder gcc för att kompilera ett C program

Postat: 03 dec 2006, 15:31
av Okänd
[quote="gasol"]tyvärr så följer inte alla build paket med ubuntu som standard :(


Ladda hen och installera build-esentials så borde det lösa sig[/quote]
Detta löser förvisso problemet, men installerar också onödigt många paket.
Det räcker med att installera libc6-dev.