2010-11-08 10 views
16

Kiedy próbowałem skompilować ten program, to nie powiodło się:Dlaczego pojawiają się błędy "nieokreślonego odniesienia", nawet jeśli dołączam odpowiednie pliki nagłówkowe?

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

void *WriteNumbers(void *threadArg) 
{ 
    int start, stop; 

    start = atoi((char *)threadArg); 
    stop = start + 10; 

    while (start < stop) 
    { 
     printf("%d\n", start++); 
     sleep(1); 
    } 
    return 0; 
} 

int main(int argc, char **argv) 
{ 
     pthread_t thread1, thread2; 

     // create the threads and start the printing 
     pthread_create(&thread1, NULL, WriteNumbers, (void *)argv[1]); 
     pthread_create(&thread2, NULL, WriteNumbers, (void *)argv[2]); 

     pthread_join(thread1, NULL); 
     pthread_join(thread2, NULL); 

     return 0; 
} 

Dało mi następujące błędy:

tmp/ccrW21s7.o: In function `main': 
pthread.c:(.text+0x83): undefined reference to `pthread_create' 
pthread.c:(.text+0xaa): undefined reference to `pthread_create' 
pthread.c:(.text+0xbd): undefined reference to `pthread_join' 
pthread.c:(.text+0xd0): undefined reference to `pthread_join' 
collect2: ld returned 1 exit status 

Dlaczego to daje mi te nieokreślone błędy referencyjnych chociaż miałem włączone pthread.h, który deklaruje te funkcje?

+1

Masz również inne problemy: nie sprawdzasz wartości 'argc', ale używasz wartości' argv'. Twoja metoda "WriteNumbers" nie zwraca wartości. – dreamlax

+0

@dreamlax: Naprawiłem problem braku zwrotu; Nie zauważyłem problemu z argx/argv. –

Odpowiedz

23

Prawdopodobnie zapomniałeś połączyć się z biblioteką Pthreads (używając -lpthread w linii poleceń).

+8

Dodałem to do wiki tagów jako FAQ. To pytanie jest zadawane na początku każdego jesiennego semestru :) –

+1

@ z zimną krwią, dlaczego nie zaakceptowałeś tego jako odpowiedzi? – Mawg

3

Trzeba połączyć pthread biblioteki do pliku binarnego, tak:

cc -o myapp myapp.c -lpthread 
21

Inni wspomnieli, że nie wiąże się z wykorzystaniem biblioteki pthread flagę -lpthread. Nowoczesne GCC (nie wiem, jak nowoczesne, moje jest 4.3.3) pozwala na użycie tylko -pthread. Od strony man:

-pthread
Dodaje wsparcie dla wielowątkowości z biblioteką Pthreads. Ta opcja ustawia flagi dla preprocesora i łącznika.

+0

Właściwie to "stary" gcc, który na to pozwala. Składnia -pthread jest bardzo starą składnią i została zapewniona tylko ze starszymi kompilatorami, które nie miały -l obsługi ... –

+1

@WouterVerhelst Nie sądzę, że to prawda. '-pthread' jest nadal zalecaną flagą do użycia, ponieważ ustawia również wymagane flagi preprocesora i kompilacji, podczas gdy' -lpthread' kieruje linkerem tylko do libpthread. –

1

Czy

gcc -pthread -o name filename.c (cpp) 

skompilować program, a następnie

./name 

aby uruchomić program.

Powiązane problemy