2010-11-08 11 views
16

Quando ho provato a compilare questo programma, non è riuscito:Perché ottengo errori di "riferimento non definito" anche quando includo i file di intestazione giusti?

#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; 
} 

mi ha dato i seguenti errori:

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 

Perché mi dà questi errori di riferimento non definiti anche se avevo incluso pthread.h, quale dichiara queste funzioni?

+1

Hai anche altri problemi: non stai controllando il valore di 'argc' ma stai usando i valori di' argv'. Il tuo metodo 'WriteNumbers' non restituisce un valore. – dreamlax

+0

@dreamlax: ho risolto il problema "no return"; Non ho notato il problema argc/argv. –

risposta

23

Probabilmente hai dimenticato di collegarti con la libreria Pthreads (usando -lpthread sulla riga di comando).

+8

Ho aggiunto questo al tag wiki come una FAQ. Questa domanda viene posta all'inizio di ogni semestre autunnale :) –

+1

@ a sangue freddo perché non l'hai accettato come risposta? – Mawg

3

è necessario collegare pthread biblioteca per il vostro binario, in questo modo:

cc -o myapp myapp.c -lpthread 
21

Altri hanno detto che non si è collegato con la libreria pthread utilizzando il flag -lpthread. Modern GCC (non so quanto moderno, il mio è 4.3.3) consente di utilizzare solo -pthread. Dalla pagina man:

-pthread
aggiunge il supporto per il multithreading con la libreria pthread. Questa opzione imposta i flag sia per il preprocessore che per il linker.

+0

In realtà, è "vecchio" gcc che lo consente. Il -pthread è una sintassi molto vecchia, e fornito solo per compatibilità con vecchi compilatori che non avevano supporto -l ... –

+1

@WouterVerhelst Non penso che sia vero. '-pthread' è ancora il flag raccomandato da utilizzare, poiché imposta anche qualsiasi flag di preprocessore e compilazione richiesto, mentre' -lpthread' indirizza solo il linker al collegamento a libpthread. –

1

fare

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

per compilare il programma, poi

./name 

per eseguire il programma.

Problemi correlati