Am instalat recent XUbuntu 11.10 64 biți, dar am probleme la compilarea celui mai simplu exemplu de pthread.
Iată codul 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); }
Și aici este comanda de compilare
gcc -lpthread pthread_simple.c
Rezultatele:
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
Stie cineva ce ” cauzează problema?
Comentarii
Răspunde
În lat Versiunile est ale compilatorului gcc
necesită ca bibliotecile să urmeze fișierele obiect sau sursă.
Deci, pentru a compila acest lucru, ar trebui să fie:
gcc pthread_sample.c -lpthread
În mod normal, deși codul pthread este compilat în acest fel:
gcc -pthread pthread_sample.c
Comentarii
- @Karlson Puteți explica de ce nu este suficient doar includerea fișierului
pthread.h
pentru ca gcc să rezolve referințele? - @iamcreasy Deoarece declarația nu este la fel ca definiția. Programul trebuie să știe unde este codul care execută o anumită funcție.
Răspuns
gcc -o exectable_namme pthread_sample.c -lpthread
Comentarii
- Ar fi util să să vă editați răspunsul pentru a explica de ce acest lucru este diferit de răspunsul deja acceptat.
Răspuns
compilați codul folosind următoarea comandă
gcc filename.c -lpthread -lrt
Comentarii
- Bună! Ar fi util dacă ați putea edita răspunsul pentru a explica de ce funcționează și pentru a evidenția de ce credeți că adaugă ceva, răspunsul deja acceptat nu acoperă. <
#include <pthread.h>
gcc -pthread...
?-Wall
, ' lipsesc anteturile. (Și sr_ este corect.)