gcc ne peut pas lier à pthread?

17

J'ai récemment installé XUbuntu 11.10 64 bits, mais j'ai du mal à compiler l'exemple pthread le plus simple.

Voici le code pthread_simple.c:

#include <stdio.h>
#include <pthread.h> 
main()  {
  pthread_t f2_thread, f1_thread; 
  void *f2(), *f1();
  int i1,i2;
  i1 = 1;
  i2 = 2;
  pthread_create(&f1_thread,NULL,f1,&i1);
  pthread_create(&f2_thread,NULL,f2,&i2);
  pthread_join(f1_thread,NULL);
  pthread_join(f2_thread,NULL);
}
void *f1(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f1: %d",i);
  pthread_exit(0); 
}
void *f2(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f2: %d",i);
  pthread_exit(0); 
}

Et voici la commande de compilation

gcc -lpthread pthread_simple.c

Les resultats:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: Dans la fonction `main ':
pthread_simple.c :(. text + 0x2c): référence non définie à `pthread_create '
pthread_simple.c :(. text + 0x46): référence non définie à `pthread_create '
pthread_simple.c :(. text + 0x57): référence non définie à `pthread_join '
pthread_simple.c :(. text + 0x68): référence non définie à `pthread_join '
collect2: ld a renvoyé 1 statut de sortie

Quelqu'un sait-il ce qui cause le problème?

chtlp
la source
Est-ce la faute de stackexchange si vous avez des inclus vides dans les deux premières lignes? Il devrait y avoir un#include <pthread.h>
Frg
Oui, j'ai utilisé l'environnement pré. Il devrait maintenant s'afficher correctement.
chtlp
BTW, veuillez compiler avec -Wall, il vous manque des en-têtes. (Et sr_ est correct.)
Mat

Réponses:

26

Dans les dernières versions du gcccompilateur, les bibliothèques doivent suivre l'objet ou les fichiers source.

Donc, pour compiler cela, cela devrait être:

gcc pthread_sample.c -lpthread

Normalement, si le code pthread est compilé de cette façon:

gcc -pthread pthread_sample.c
Karlson
la source
1
@Karlson Pouvez-vous expliquer pourquoi il pthread.hne suffit pas d' inclure le fichier pour que gcc résolve les références?
Quazi Irfan
2
@iamcreasy Parce que la déclaration n'est pas la même chose que la définition. Le programme doit savoir où se trouve le code exécutant une fonction particulière.
Karlson
1
gcc -o exectable_namme pthread_sample.c -lpthread
Rodrigue SAOUNGOUMI SOURPELE
la source
3
Il serait utile de modifier votre réponse pour expliquer pourquoi elle est différente de la réponse déjà acceptée.
roaima
0

compiler du code en utilisant la commande suivante

gcc filename.c -lpthread -lrt
user109578
la source
1
Salut! Il serait utile de modifier votre réponse pour expliquer pourquoi cela fonctionne et pour souligner pourquoi vous pensez qu'elle ajoute quelque chose que la réponse déjà acceptée ne couvre pas.
dhag