Forum Programmation.c++ undefined reference pthread_kill

Posté par  .
Étiquettes : aucune
0
13
sept.
2007
Bonjour,

OS = Mandriva PowerPack 2007

voici le résultat de ma compilation :
undefined reference to 'pthread_kill (unsigned long, int)'

voici ma ligne de compilation :
g++ sample1.cpp -o sample1 -lpthread

Pouvez vous me dire pourquoi j'ai une erreur ?

Ce qui est bizarre c'est que si j'enlève le pthread_kill, les fonctions pthread_create, pthread_join fonctionne bien....

j'ai essayé pthread_cancel à la place de pthread_kill mais ça bloque mon programme, même si je paramètre mon thread avec pthread_setcancelstate et pthread_setcanceltype.

Pouvez vous m'indiquer comment il faut utiliser pthread_cancel ?

Quel est la différence entre pthread_kill et pthread_cancel ?

Merci.
  • # mes 2cts

    Posté par  . Évalué à 1.

    >undefined reference to 'pthread_kill (unsigned long, int)'
    >Pouvez vous me dire pourquoi j'ai une erreur ?

    A premiere vue parceque pthread_kill est déclarée avec
    int pthread_kill(pthread_t thread, int sig);
    et que dans ton programme le permier argument que tu lui donne n'est pas un pthread_t mais un ulong donc le linker hurle a la fonction manquante ?
    Tu n'aurais pas un & qui traine devant le nom de ta variable sur la ligne de pthread_kill ?
    • [^] # Re: mes 2cts

      Posté par  . Évalué à 1.

      je n'ai pas mis de & ...

      voici l'extrait de mon code :

      main()
      {
      pthread_t tc;
      .....
      pthread_create....
      .....
      pthread_kill(tc,9);
      ...
      }

      précision sur l'erreur :
      undefined reference to 'pthread_kill (unsigned long, int)'
      ld return 1 exit status.
      • [^] # Re: mes 2cts

        Posté par  . Évalué à 2.

        Vérifie que tu as bien #include <pthread.h> et <signal.h>, dans cet ordre.
        Essaie de linker également avec l'option -lrt : je crois que pthread_kill() fait partie des extensions temps-réel de posix qui, dans le domaine des signaux multithreadés, sont ce qu'il se conçoit de plus simple -- pour placer des bugs dans le code s'entend.
        Sinon je ne vois pas d'autres pistes ? Le fait que ton linker connaisse le type des arguments de la fonction manquante me fait penser à un problème de C/C++. pthread_kill() ne serait pas déclarée extern "C" ??

        Enfin si : supprimer les appels à pthread_kill() et pthread_cancel() de ton code : en plus de lier correctement, tu enlèveras des bugs. Ou alors, sois paranoïaque et relis cinq fois la documentation. Le livre "Programmation système en C sous Linux" de Blaess (une référence) décrit très bien les problèmes auxquels on s'expose avec ces p*** de fonctions, et comment les éviter (c'est quasi impossible).
        • [^] # Re: mes 2cts

          Posté par  . Évalué à 1.

          C'était ça...j'avais bien mis #include <pthread.h> avant <signal.h> mais j'avais d'autre include entre les deux...
          Maintenant ça compile correctement.
          Merci
        • [^] # Re: mes 2cts

          Posté par  . Évalué à 1.

          C'était bien ça....
          J'avais bien <pthread.h> avant <signal.h> mais j'avais aussi <bits/signal.h> et apparement c'était lui qui me foutait la patouille...je l'ai supprimé et Oh mircacle ! ça fonctionne !!

          Merci.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.