2010-11-08 10 views
16

Wenn ich dieses Programm zu kompilieren versucht, es ist fehlgeschlagen:Warum bekomme ich "undefinierte Referenz" -Fehler, selbst wenn ich die richtigen Header-Dateien einschließe?

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

Es gab mir die folgenden Fehler:

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 

Warum es mir nicht geben diese undefined reference Fehler, obwohl ich pthread.h aufgenommen hatte, was erklärt diese Funktionen?

+1

Sie haben auch andere Probleme: Sie überprüfen nicht den Wert von 'argc', aber Sie verwenden die Werte von' argv'. Ihre Methode 'WriteNumbers' gibt keinen Wert zurück. – dreamlax

+0

@dreamlax: Ich habe das 'no return' Problem behoben; Ich habe das argc/argv-Problem nicht bemerkt. –

Antwort

23

Sie haben wahrscheinlich vergessen, eine Verbindung zur Pthreads-Bibliothek herzustellen (mit -lpthread in der Befehlszeile).

+8

Ich habe dies zum Tag Wiki als FAQ hinzugefügt. Diese Frage wird zu Beginn jedes Herbstsemesters gestellt :) –

+1

@ kaltblütig Warum hast du das nicht als Antwort akzeptiert? – Mawg

3

Sie benötigen pthread Bibliothek auf Ihre binären zu verknüpfen, wie folgt aus:

cc -o myapp myapp.c -lpthread 
21

Andere haben erwähnt, dass Sie nicht mit der pthread-Bibliothek mit dem -lpthread Flag verknüpft haben. Modern GCC (nicht sicher, wie modern, meins ist 4.3.3) können Sie nur -pthread verwenden. Aus der Manpage:

-pthread
Fügt Unterstützung für Multithreading mit der pthreads-Bibliothek. Diese Option setzt Flags für den Präprozessor und den Linker.

+0

Eigentlich ist es "alt" gcc was das erlaubt. Der -pthread ist eine sehr alte Syntax und nur für die Kompatibilität mit älteren Compilern vorgesehen, die keine -l-Unterstützung hatten ... –

+1

@WouterVerhelst Ich glaube nicht, dass das stimmt. '-pthread' ist immer noch das empfohlene Flag, da es auch alle erforderlichen Präprozessor- und Kompilierungsflags setzt, während '-lpthread' nur den Linker anleitet, zu libpthread zu verlinken. –

1

Do

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

das Programm zu kompilieren, dann

./name 

das Programm auszuführen.

Verwandte Themen