Jeg har nylig installert XUbuntu 11.10 64bit, men jeg har problemer med å kompilere det mest enkle pthread-eksemplet.
Her er koden pthread_simple.c
:
#include <stdio.h> #include <pthread.h> main() { pthread_t f2_thread, f1_thread; void *f2(), *f1(); int i1,i2; i1 = 1; i2 = 2; pthread_create(&f1_thread,NULL,f1,&i1); pthread_create(&f2_thread,NULL,f2,&i2); pthread_join(f1_thread,NULL); pthread_join(f2_thread,NULL); } void *f1(int *x){ int i; i = *x; sleep(1); printf("f1: %d",i); pthread_exit(0); } void *f2(int *x){ int i; i = *x; sleep(1); printf("f2: %d",i); pthread_exit(0); }
Og her er kompileringskommandoen
gcc -lpthread pthread_simple.c
Resultatene:
lptang@tlp-linux:~/test/test-pthread$ gcc -lpthread pthread_simple.c /tmp/ccmV0LdM.o: In function `main": pthread_simple.c:(.text+0x2c): undefined reference to `pthread_create" pthread_simple.c:(.text+0x46): undefined reference to `pthread_create" pthread_simple.c:(.text+0x57): undefined reference to `pthread_join" pthread_simple.c:(.text+0x68): undefined reference to `pthread_join" collect2: ld returned 1 exit status
Er det noen som vet hva » s forårsaker problemet?
Kommentarer
Svar
I lat est versjoner av gcc
kompilator krever at biblioteker følger objektet eller kildefilene.
Så for å kompilere dette skal det være:
gcc pthread_sample.c -lpthread
Normalt sett er pthread-koden samlet slik:
gcc -pthread pthread_sample.c
Kommentarer
- @Karlson Kan du forklare hvorfor bare å inkludere
pthread.h
filen ikke er nok til at gcc kan løse referansene? - @iamcreasy Fordi erklæring ikke er det samme som definisjon. Programmet trenger å vite hvor koden som utfører en bestemt funksjon er.
Svar
gcc -o exectable_namme pthread_sample.c -lpthread
Kommentarer
- Det ville være nyttig å redigere svaret for å forklare hvorfor dette er forskjellig fra det allerede aksepterte svaret.
Svar
kompiler koden med følgende kommando
gcc filename.c -lpthread -lrt
Kommentarer
- Hei! Det ville være nyttig hvis du kunne redigere svaret ditt for å forklare hvorfor det fungerer, og for å markere hvorfor du tror det legger til noe som allerede akseptert svar ikke dekker ' t.
#include <pthread.h>
gcc -pthread...
?-Wall
, du ' mangler overskrifter. (Og sr_ er riktig.)