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?

4voto

sam Punkte 1257

Sie müssen nur "pthread" in proprieties=>C/C++ build=>GCC C++ Linker=>Libraries=> top part "Libraries(-l)" hinzufügen. das war's

4voto

kalu Wang Punkte 131

In der Manpage nachsehen und Sie erhalten.

Kompilieren und linken mit -pthread.

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

       Compile and link with -pthread.
       ....

4voto

Sold Out Punkte 1003

Da keine der Antworten genau meinen Bedarf abdeckte (ich benutze MSVS Code), füge ich hier auch meine Erfahrungen mit dieser IDE und den CMAKE Build Tools hinzu.

Schritt 1: Vergewissern Sie sich, dass Sie in Ihrer .cpp (oder .hpp, falls erforderlich) die Datei enthalten:

#include <functional>

Schritt 2 Für Benutzer von MSVSCode IDE: Fügen Sie diese Zeile zu Ihrer c_cpp_properties.json Datei:

"compilerArgs": ["-pthread"],

Add this line to your c_cpp_properties.json file

Schritt 2 Für Benutzer der CMAKE-Bauwerkzeuge: Fügen Sie diese Zeile zu Ihrem CMakeLists.txt

set(CMAKE_CXX_FLAGS "-pthread")

Hinweis: Hinzufügen der Flagge -lpthread (anstelle von -tread ) führt zu einer fehlgeschlagenen Verknüpfung.

2voto

artless noise Punkte 19566

De man gcc ,

  -pthread
       Define additional macros required for using the POSIX threads library.
       You should use this option consistently for both compilation and linking.
       This option is supported on GNU/Linux targets, 
           most other Unix derivatives, 
           and also on x86 Cygwin and MinGW targets.

Es ist richtig, dass -pthread ist eine Option und der beste Weg, dies zu tun. In einigen Antworten wird behauptet, dass es einen anderen kompilierten Code erzeugt. Dies ist irreführend.

Wenn Sie Folgendes duplizieren möchten -pthread könnten Sie verwenden -lpthread -D_REENTRANT=1 . Es gibt also zwei Dinge, die mit dem -pthread Option.

Sie steht in der Tat in Verbindung mit dem pthread Bibliothek so viele Antworten ausdrücken. Außerdem ist die Reihenfolge der pthread-Bibliothek wichtig, da sie einige schwache Symbole außer Kraft setzen kann. Eine korrekte Version verwendet also -lpthread möglicherweise mehrmals in der Befehlszeile eingeben müssen.

Der andere wichtige Teil ist die _REENTRANT definieren. Beachten Sie, dass dies im Namespace der Implementierung liegt. Einige Leute mögen sich um die Portabilität kümmern, andere nicht. Es ist jedoch sehr wichtig, dass es als erstes in der Kompiliereinheit definiert wird. Dieses Symbol wird die Art und Weise ändern, wie viele System-Header-Dateien geparst werden.

Sie können einschließen #define _REENTRANT 1 am Anfang jeder Quelldatei, aber es ist viel einfacher, sie in der Befehlszeile zu haben. Auch hier gilt, dass die -pthread ist der beste Weg, dies zu erreichen. Auch, gcc kann sich die Art und Weise, wie dies umgesetzt wird, in Zukunft ändern. Ich denke jedoch, dass es für Programmierer wichtig ist, zu verstehen, was vor sich geht.


term.c: In Funktion 'main': term.c:23: Warnung: Inkompatible implizite Deklaration der eingebauten Funktion 'exit'

Sie haben nie <stdlib.h> , donde exit() erklärt wird. Ich denke auch, dass neuere Versionen von gcc die Notwendigkeit für _REENTRANT entfernt haben.

Es ist also NICHT einen anderen Code zu erzeugen. D.h., das Backend des Compilers ist NICHT anders. Es handelt sich lediglich um eine bedingte Kompilierung und Verknüpfung mit verschiedenen Bibliotheken. Es wird kein "sperrfreier" Code generiert oder entsprechende Maschinensperren hinzugefügt, weil Sie diese Option verwendet haben.

0voto

naXa Punkte 30160

Wählen Sie in Anjuta das Menü Build und dann Configure Project. Fügen Sie im Feld Configure Options hinzu:

LDFLAGS='-lpthread'

Hoffentlich hilft es auch jemandem...

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