541 Stimmen

Undefinierter Verweis auf pthread_create in Linux

Ich habe die folgende Demo aus dem Internet heruntergeladen https://computing.llnl.gov/tutorials/pthreads/

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

Aber wenn ich es auf meinem Rechner (mit Ubuntu Linux 9.04) kompiliere, erhalte ich folgenden Fehler:

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function ‘main’:
term.c:23: warning: incompatible implicit declaration of built-in function ‘exit’
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

Das ergibt für mich keinen Sinn, denn die Kopfzeile enthält pthread.h die die pthread_create Funktion. Hat jemand eine Idee, was falsch läuft?

920voto

Employed Russian Punkte 180738

Für Linux lautet der korrekte Befehl:

gcc -pthread -o term term.c

Im Allgemeinen sollten Bibliotheken den Quellen und Objekten auf der Kommandozeile folgen, und -lpthread ist keine "Option", sondern eine Bibliotheksspezifikation. Auf einem System mit nur libpthread.a installiert,

gcc -lpthread ...

wird die Verknüpfung fehlschlagen.

56voto

Gopika BG Punkte 982

Für Linux lautet der korrekte Befehl:

gcc -o term term.c -lpthread
  1. Sie müssen -lpthread direkt nach dem Compile-Befehl einfügen. Dieser Befehl weist den Compiler an, das Programm mit der Bibliothek pthread.h auszuführen.
  2. gcc -l verknüpft mit einer Bibliotheksdatei, Link -l mit dem Bibliotheksnamen ohne das Präfix lib.

45voto

sam Punkte 1257

In der Eklipse

Eigenschaften->c/c++Build->Einstellungen->GCC C++ Linker->Bibliotheken im oberen Teil "pthread" hinzufügen

36voto

Vom Linux-Terminal aus funktionierte das Kompilieren mit folgendem Befehl (angenommen, die zu kompilierende c-Datei heißt test.c):

gcc -o test test.c -pthread

Hoffentlich hilft es jemandem!

33voto

Jayhello Punkte 4867

Wenn Sie cmake verwenden, können Sie verwenden:

add_compile_options(-pthread)

Oder

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X