gcc kan ' inte länka till pthread?

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

  • Är det stackexchange ' s fel som du har tom innehåller i de två första raderna? Det borde finnas en #include <pthread.h>
  • Ja, jag använde pre-miljön. Den ska nu visas korrekt.
  • Försökte gcc -pthread...?
  • BTW, kompilera med -Wall, du ' saknar rubriker. (Och sr_ stämmer.)

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *