it-swarm.com.de

Undefinierter Verweis auf pthread_create in Linux

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

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

Wenn ich es jedoch auf meinem Computer kompiliere (unter Ubuntu Linux 9.04), erhalte ich die folgende Fehlermeldung:

[email protected]:~/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 macht für mich keinen Sinn, da der Header pthread.h enthält, der die pthread_create-Funktion haben sollte. Irgendwelche Ideen, was schief läuft?

305
Ralph

Beide Antworten auf diese Frage sind bisher falsch .
Für Linux lautet der korrekte Befehl:

gcc -pthread -o term term.c

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

gcc -lpthread ...

wird keine Verbindung herstellen.

588

in Eclipse 

eigenschaften-> c/c ++ Build-> Einstellung-> GCC C++ - Linker-> Bibliotheken im oberen Teil fügen Sie "pthread" hinzu.

32
sam

In der folgenden Tabelle sind mehrere Beispiele für Kompilierbefehle aufgeführt, die für Pthreads-Codes verwendet werden, wenn Sie das folgende Lernprogramm weiter lesen:

https://computing.llnl.gov/tutorials/pthreads/#Compiling

enter image description here

15
dylanninin

Vom Linux-Terminal aus funktionierte das Kompilieren mit dem folgenden Befehl (die angenommene c-Datei heißt test.c):

gcc -o test test.c -pthread

Hoffe es hilft jemandem!

Kompilieren Sie es wie folgt: gcc demo.c -o demo -pthread

6
leesagacious

Sie müssen die Option -lpthread mit gcc verwenden.

3
xiaolong

sie müssen nur "pthread" in Eigenschaften hinzufügen => C/C++ build => GCC C++ Linker => Libraries => oberer Teil "Libraries (-l)" ..__ 

3
sam

Für Linux lautet der richtige Befehl:

gcc -o term term.c -lpthread

sie müssen -lpthread direkt nach dem Kompilierungsbefehl einfügen. Dieser Befehl weist den Compiler an, das Programm mit pthread.h library.gcc -l auszuführen, das mit einer Bibliotheksdatei verknüpft ist. Link -l mit dem Bibliotheksnamen ohne das Präfix lib.

2
gopika

Wenn Sie cmake verwenden, können Sie Folgendes verwenden:

add_compile_options(-pthread)

Oder 

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

Gehen Sie in Anjuta zum Menü Erstellen und dann Projekt konfigurieren. Fügen Sie im Feld Konfigurationsoptionen Folgendes hinzu:

LDFLAGS='-lpthread'

Ich hoffe es hilft auch jemandem ...

0
naXa

Wenn Sie mehrere Bibliotheken verwenden, überprüfen Sie manchmal die Bibliotheksabhängigkeit . (Z. B.

0
user1793997

überprüfen Sie die Manpage und Sie erhalten.

Kompilieren und verknüpfen 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.
       ....
0
kalu Wang

In Visual Studio 2019 geben Sie -pthread auf den Eigenschaftenseiten für das Projekt an unter:

Linker -> Befehlszeile -> Zusätzliche Optionen

Geben Sie -pthread in das Textfeld ein.

0
WBuck

Ich glaube, der richtige Weg, pthread in CMake einzufügen, ist der folgende

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
0
Rufus