Référence non définie à pthread_create sous Linux

376

J'ai récupéré la démo suivante sur le Web à partir de 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);
}

Mais lorsque je le compile sur ma machine (exécutant Ubuntu Linux 9.04), j'obtiens l'erreur suivante:

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

Cela n'a aucun sens pour moi, car l'en-tête inclut pthread.h, qui devrait avoir la pthread_createfonction. Des idées ce qui ne va pas?

Ralph
la source
6
De plus: selon la plateforme, vous pouvez avoir besoin (a) d'un compilateur différent pour les threads, (b) d'une libc différente pour les threads (ie -lc_r), (c) -threadou -threadsou autre, au lieu de ou en plus de -lpthread.
éphémère
Juste un peu au-dessus de cet exemple, vous verrez un tableau des commandes de compilateur correctes, que ce soit GCC, IBM, etc. «Employé russe» est correct.
Jonathon Reinhart
8
Pouvez-vous s'il vous plaît décocher ma réponse, afin que je puisse la supprimer (et marquer celle qui est réellement correcte, qui est la plus votée)?
Pavel Minaev
3
-lpthreadest nécessaire lors de la compilation
How Chen
5
solutionLDFLAGS= -pthread -lpthread
dsnk

Réponses:

696

Jusqu'à présent, les deux réponses à cette question sont incorrectes .
Pour Linux, la commande correcte est:

gcc -pthread -o term term.c

En général, les bibliothèques doivent suivre les sources et les objets en ligne de commande, et ce -lpthreadn'est pas une "option", c'est une spécification de bibliothèque. Sur un système avec seulement libpthread.ainstallé,

gcc -lpthread ...

ne parviendra pas à lier.

Russe employé
la source
2
+1 cette solution a fonctionné ... d'autres non. En outre, la suggestion que «les bibliothèques devraient suivre les sources et les objets» est un excellent conseil - une citation ou une explication supplémentaire serait formidable.
sholsapp
7
@sholsapp Voici l'explication: webpages.charter.net/ppluzhnikov/linker.html
Employé russe
Cela s'est encore erré pour moi jusqu'à ce que je mette -lpthread à la fin de ma commande. gcc term.c -lpthread
CornSmith
Je viens de rencontrer un problème de compilation de snortsam sur Ubuntu 14.04 qui contient en fait à la fois libpthread.a et libpthread.so. J'obtenais undefined reference to 'pthread_cancel'et des undefined reference to 'pthread_create'erreurs. Je suis tombé sur ce message SO et j'ai pensé essayer la réponse d'Employed Russian. J'ai ouvert makesnortsam.shdans VI et j'ai exécuté la commande :%s/lpthread/pthread/gpour remplacer lpthread par pthread afin qu'il utilise à la -pthreadplace de -lpthreadlors de la compilation. J'ai alors pu compiler snortsam. Merci russe employé!
dcarrith
5
Pour toute personne utilisant CODEBLOCKS: Ajouter -pthreadaux options de création de projet -> Paramètres de l'éditeur de liens -> Autres options de l'éditeur de liens.
user3728501
39

en éclipse

propriétés-> c / c ++ Build-> setting-> GCC C ++ linker-> bibliothèques dans la partie supérieure ajouter "pthread"

sam
la source
La même astuce s'applique dans code :: project (et je pense que d'autres IDE aussi)
Fil
19

À partir du terminal Linux, ce qui a fonctionné pour moi, c'était la compilation à l'aide de la commande suivante (supposons que le fichier c que je veux compiler s'appelle test.c):

gcc -o test test.c -pthread

J'espère que ça aide quelqu'un!

Alexander Nenartovich
la source
19

Pour Linux, la commande correcte est:

gcc -o term term.c -lpthread
  1. vous devez mettre -lpthread juste après la commande de compilation, cette commande indiquera au compilateur d'exécuter le programme avec la bibliothèque pthread.h.
  2. gcc -l établit un lien avec un fichier de bibliothèque. Lien -l avec un nom de bibliothèque sans le préfixe lib.
Gopika BG
la source
Ce n'est pas une bonne idée d'utiliser un indicateur non standard lorsqu'il existe un indicateur standard qui a la même fonction sur votre plate-forme.
David Schwartz
12

Si vous utilisez cmake, vous pouvez utiliser:

add_compile_options(-pthread)

Ou

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

Compilez-le comme ceci: gcc demo.c -o demo -pthread

leesagace
la source
6

Je crois que la bonne façon d'ajouter pthreaden CMakeest avec ce qui suit

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
Rufus
la source
4

Dans Visual Studio 2019, spécifiez -pthreaddans les pages de propriétés du projet sous:

Éditeur de liens -> Ligne de commande -> Options supplémentaires

Tapez dans -pthreadla zone de texte.

WBuck
la source
3

Vous devez utiliser l'option -lpthreadavec gcc.

xiaolong
la source
7
mauvaise information! -lpthreadn'est pas une "option", il spécifie une bibliothèque.
une option de ligne de commande (contrairement à un argument de ligne de commande)
Alexander Stohr
3

il vous suffit d'ajouter "pthread" dans les propriétés => C / C ++ build => GCC C ++ Linker => Libraries => top part "Libraries (-l)". c'est ça

sam
la source
2

consultez la page de manuel et vous obtiendrez.

Compilez et liez avec -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
la source
0

À Anjuta, accédez au menu Générer, puis Configurer le projet. Dans la zone Configurer les options, ajoutez:

LDFLAGS='-lpthread'

J'espère que ça aidera quelqu'un aussi ...

naXa
la source
0

Parfois, si vous utilisez plusieurs bibliothèques, vérifiez la dépendance de la bibliothèque. (par exemple -lpthread -lSDL ... <==> ... -lSDL -lpthread)

user1793997
la source