Undefinierter Verweis auf pthread_create unter Linux

376

Ich habe die folgende Demo aus dem Internet unter 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);
}

Aber wenn ich es auf meinem Computer kompiliere (unter Ubuntu Linux 9.04), erhalte ich den 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, da der Header enthält pthread.h, der die pthread_createFunktion haben sollte. Irgendwelche Ideen, was falsch läuft?

Ralph
quelle
6
Außerdem: je nach Plattform, müssen Sie (a) einen anderen Compiler für Fäden, (b) eine andere libc für Fäden (dh -lc_r), (c) -threadoder -threadsoder andere, anstelle oder zusätzlich zu -lpthread.
Ephemient
Nur ein wenig oberhalb dieses Beispiels sehen Sie eine Tabelle mit den richtigen Compilerbefehlen, ob es sich um GCC, IBM usw. handelt. 'Employed Russian' ist korrekt.
Jonathon Reinhart
8
Können Sie bitte meine Antwort aufheben, damit ich sie löschen kann (und die tatsächlich korrekte, die am höchsten bewertete) markieren?
Pavel Minaev
3
-lpthreadwird beim Kompilieren benötigt
Wie Chen
5
LösungLDFLAGS= -pthread -lpthread
dsnk

Antworten:

696

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

gcc -pthread -o term term.c

Im Allgemeinen sollten Bibliotheken Quellen und Objekten in der Befehlszeile folgen und -lpthreadsind keine "Option", sondern eine Bibliotheksspezifikation. Auf einem System mit nur libpthread.ainstalliert,

gcc -lpthread ...

wird nicht verlinken.

Angestellt Russisch
quelle
2
+1 diese Lösung hat funktioniert ... andere nicht. Auch der Vorschlag, dass Bibliotheken Quellen und Objekten folgen sollten, ist ein guter Rat - ein Zitat oder eine weitere Erklärung wäre großartig.
Sholsapp
7
@sholsapp Hier ist die Erklärung: webpages.charter.net/ppluzhnikov/linker.html
Angestellt Russisch
Dies war für mich immer noch falsch, bis ich -lpthread ganz am Ende meines Befehls platzierte. gcc term.c -lpthread
CornSmith
Ich bin gerade auf ein Problem beim Kompilieren von snortsam unter Ubuntu 14.04 gestoßen, das tatsächlich sowohl libpthread.a als auch libpthread.so enthält. Ich bekam undefined reference to 'pthread_cancel'und undefined reference to 'pthread_create'Fehler. Ich bin auf diesen SO-Beitrag gestoßen und dachte, ich würde die Antwort von Employed Russian ausprobieren. Ich habe makesnortsam.shin VI geöffnet und den Befehl ausgeführt :%s/lpthread/pthread/g, lpthread durch pthread zu ersetzen, damit es -pthreadanstelle -lpthreadbeim Kompilieren verwendet wird. Ich konnte dann Snortsam kompilieren. Danke Angestelltes Russisch!
Dcarrith
5
Für alle, die CODEBLOCKS verwenden: -pthreadZu Projekterstellungsoptionen hinzufügen -> Linker-Einstellungen -> Andere Linker-Optionen.
user3728501
39

in der Finsternis

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

Sam
quelle
Der gleiche Tipp gilt für code :: project (und ich denke, andere IDE auch)
Fil
19

Beim Ausführen vom Linux-Terminal aus funktionierte das Kompilieren mit dem folgenden Befehl (Angenommen, die c-Datei, die ich kompilieren möchte, heißt test.c):

gcc -o test test.c -pthread

Hoffe es hilft jemandem!

Alexander Nenartovich
quelle
19

Für Linux lautet der richtige Befehl:

gcc -o term term.c -lpthread
  1. Sie müssen -lpthread direkt nach dem Kompilierungsbefehl eingeben. Dieser Befehl weist den Compiler an, ein 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.
Gopika BG
quelle
Es ist keine gute Idee, ein Nicht-Standard-Flag zu verwenden, wenn ein Standard-Flag vorhanden ist, das auf Ihrer Plattform dieselbe Funktion hat.
David Schwartz
12

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

add_compile_options(-pthread)

Oder

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
Jayhello
quelle
7

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

leesagacious
quelle
6

Ich glaube , die richtige Art und Weise der Zugabe pthreadin CMakeden folgenden Ergebnissen

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
Rufus
quelle
4

Geben Sie -pthreadin Visual Studio 2019 auf den Eigenschaftenseiten für das Projekt unter:

Linker -> Befehlszeile -> Zusätzliche Optionen

Geben Sie -pthreadin das Textfeld ein .

WBuck
quelle
3

Sie müssen die Option -lpthreadmit gcc verwenden.

Xiaolong
quelle
7
falsche Information! -lpthreadist keine "Option", sondern gibt eine Bibliothek an.
eine Befehlszeilenoption (im Gegensatz zu einem Befehlszeilenargument)
Alexander Stohr
3

Sie müssen nur "pthread" in den Eigenschaften hinzufügen => C / C ++ build => GCC C ++ Linker => Bibliotheken => oberer Teil "Libraries (-l)". das ist es

Sam
quelle
2

Überprüfen Sie die Manpage und Sie werden erhalten.

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

Gehen Sie in Anjuta zum Menü Erstellen und dann zum Konfigurieren des Projekts. Fügen Sie im Feld Optionen konfigurieren Folgendes hinzu:

LDFLAGS='-lpthread'

Hoffe, es wird auch jemandem helfen ...

naXa
quelle
0

Wenn Sie mehrere Bibliotheken verwenden, überprüfen Sie manchmal die Bibliotheksabhängigkeit. (zB -lpthread -lSDL ... <==> ... -lSDL -lpthread)

user1793997
quelle