Jag har nyligen installerat XUbuntu 11.10 64bit, men jag har problem med att sammanställa det enklaste pthread-exemplet.
Här är 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); }
Och här är kompileringskommandot
gcc -lpthread pthread_simple.c
Resultaten:
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
Vet någon vad ” orsakar problemet?
Kommentarer
Svar
I lat est versioner av gcc
kompilatorn kräver att bibliotek följer objektet eller källfilerna.
Så för att kompilera detta bör det vara:
gcc pthread_sample.c -lpthread
Normalt kompileras dock pthread-kod på detta sätt:
gcc -pthread pthread_sample.c
Kommentarer
- @Karlson Kan du snälla förklara varför bara att inkludera
pthread.h
-filen inte räcker för att gcc ska lösa referenserna? - @iamcreasy Eftersom deklarationen inte är samma som definition. Programmet måste veta var koden som kör en viss funktion är.
Svar
gcc -o exectable_namme pthread_sample.c -lpthread
Kommentarer
- Det skulle vara bra att redigera ditt svar för att förklara varför detta skiljer sig från det redan accepterade svaret.
Svar
kompilera kod med följande kommando
gcc filename.c -lpthread -lrt
Kommentarer
- Hej! Det skulle vara till hjälp om du kunde redigera ditt svar för att förklara varför det fungerar och för att markera varför du tror att det lägger till något som det redan accepterade svaret inte ' täcker.
#include <pthread.h>
gcc -pthread...
?-Wall
, du ' saknar rubriker. (Och sr_ stämmer.)