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?


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

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


0

compiler du code en utilisant la commande suivante

gcc filename.c -lpthread -lrt

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.