542 votes

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

J'aimerais apprendre à écrire des programmes en C qui utilisent des threads. 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 (sous 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 comprend pthread.h qui devrait avoir le pthread_create fonction. Une idée de ce qui ne va pas ?

921voto

Employed Russian Points 50479

Les deux réponses à cette question jusqu'à présent sont incorrect .
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 sur la ligne de commande, et -lpthread n'est pas une "option", c'est une spécification de la bibliothèque. Sur un système avec seulement libpthread.a installé,

gcc -lpthread ...

ne pourront pas être liés.

50voto

Pavel Minaev Points 60647

Ce n'est pas le compilateur qui se plaint, c'est l'éditeur de liens. Vous avez oublié de lier libpthread :

gcc -oterm -lpthread term.c

Aussi, vous avez oublié de #include <stdlib.h> pour une déclaration de exit() .

45voto

sam Points 207

en éclipse

properties->c/c++Build->setting->GCC C++ linker->libraries dans la partie supérieure ajoutez "pthread

20voto

dylanninin Points 41

En fait, il donne plusieurs exemples de commandes de compilation utilisées pour les codes pthreads sont énumérés dans le tableau ci-dessous, si vous continuez à lire le tutoriel suivant :

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

enter image description here

4voto

pdxhiker Points 342

Vous devez utiliser l'option -lpthread avec gcc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X