Ik heb onlangs XUbuntu 11.10 64bit geïnstalleerd, maar ik heb problemen met het compileren van het eenvoudigste pthread-voorbeeld.
Hier is de code 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); }
En hier is de compileeropdracht
gcc -lpthread pthread_simple.c
De 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
Weet iemand wat ” veroorzaakt het probleem?
Opmerkingen
Antwoord
In de lat est versies van gcc
compiler vereisen dat bibliotheken het object of de bronbestanden volgen.
Dus om dit te compileren zou het moeten zijn:
gcc pthread_sample.c -lpthread
Normaal gesproken, hoewel pthread-code op deze manier is gecompileerd:
gcc -pthread pthread_sample.c
Reacties
- @Karlson Kunt u alstublieft uitleggen waarom het opnemen van het
pthread.h
-bestand niet voldoende is voor gcc om de verwijzingen op te lossen? - @iamcreasy Omdat declaratie dat niet is hetzelfde als de definitie. Het programma moet weten waar de code die een bepaalde functie uitvoert, is.
Answer
gcc -o exectable_namme pthread_sample.c -lpthread
Reacties
- Het zou handig zijn om je antwoord te bewerken om uit te leggen waarom dit verschilt van het reeds geaccepteerde antwoord.
Antwoord
compileer code met het volgende commando
gcc filename.c -lpthread -lrt
Reacties
- Hallo! Het zou handig zijn als u uw antwoord zou kunnen bewerken om uit te leggen waarom het werkt, en om te benadrukken waarom u denkt dat het iets toevoegt dat het reeds geaccepteerde antwoord niet ' t cover.
#include <pthread.h>
gcc -pthread...
?-Wall
, je ' mist headers. (En sr_ is correct.)