Jeg har for nylig installeret XUbuntu 11.10 64bit, men jeg har problemer med at kompilere det mest enkle pthread-eksempel.
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
Resultaterne:
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 der nogen der ved hvad ” s forårsager problemet?
Kommentarer
Svar
I lat est-versioner af gcc
-kompilator kræver, at biblioteker følger objekt- eller kildefilerne.
Så for at kompilere dette skal det være:
gcc pthread_sample.c -lpthread
Selvom pthread-koden normalt er kompileret på denne måde:
gcc -pthread pthread_sample.c
Kommentarer
- @Karlson Kan du venligst forklare, hvorfor bare inkludering af
pthread.h
filen ikke er nok til, at gcc kan løse referencerne? - @iamcreasy Fordi erklæring ikke er det samme som definition. Programmet skal vide, hvor koden, der udfører en bestemt funktion, er.
Svar
gcc -o exectable_namme pthread_sample.c -lpthread
Kommentarer
- Det ville være nyttigt at redigere dit svar for at forklare hvorfor dette adskiller sig fra det allerede accepterede svar.
Svar
kompilér kode ved hjælp af følgende kommando
gcc filename.c -lpthread -lrt
Kommentarer
- Hej! Det ville være nyttigt, hvis du kunne redigere dit svar for at forklare, hvorfor det fungerer, og for at fremhæve, hvorfor du synes, det tilføjer noget, som det allerede accepterede svar ikke dækker ' t.
#include <pthread.h>
gcc -pthread...
?-Wall
, du ' mangler overskrifter. (Og sr_ er korrekt.)