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

Här diskuteras programmering och utveckling
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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
Användarvisningsbild
Simon Eriksson
Inlägg: 11
Blev medlem: 20 aug 2006, 22:47
Ort: Jönköping

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

Inlägg 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.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg av Okänd »

jo det ska inte vara några problem att kompilera C++ program med gcc.
Användarvisningsbild
MdaG
Inlägg: 29
Blev medlem: 05 sep 2006, 16:25
Ort: Stockholm

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

Inlägg 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.
mans
Inlägg: 3
Blev medlem: 03 dec 2006, 01:08
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS

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

Inlägg 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!
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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
mans
Inlägg: 3
Blev medlem: 03 dec 2006, 01:08
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS

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

Inlägg av mans »

Nu funkar det :) Tack för hjälpen!
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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.
Skriv svar

Återgå till "Programmering och webbdesign"