IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

A propos de la bibliothèque libpthreadGC1.a


Sujet :

C

  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut A propos de la bibliothèque libpthreadGC1.a
    Bien voilà, je désirais intégrer la bibliothèque libpthread.a et apparemment elle se nomme ainsi maintenant libpthreadGC1.a.
    Pour cela, je suis allé la chercher sur le lien suivant:
    ftp://sources.redhat.com/pub/pthreads-win32/

    Faut il pour utiliser une bibliothèque (.a ou dll, d'ailleurs quelle est la différence?) inclure les fichiers d'entêtes?

    Par rapport à mon cas particulier, j'utilise devC++. Dans le répertoire de mon projet, j'ai donc copié cette librairie.
    Puis je suis allé sous devC++ dans "option du projet"->onglet "paramètres" et j'ai fait les ajouts suivants:
    - dans "compilateur", j'ai ajouté la ligne suivante: -lpthread
    - dans "éditeur des liens": j'ai inclue la bibiliothèque libpthreadGC1.a

    Est ce bien ainsi qu'il faut régler le compilateur? ou manque t'il des choses à faire?
    Je compile et je me retrouve avec le fameux message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pthread.h: no such file or directory
    Maintenant, ce que j'ai fait en attendant de comprendre le pourquoi:
    J'ai ajouté dans le répertoire courant de mon projet les fichiers suivants:
    - pthread.h
    - sched.h
    et j'ai dû mettre:
    au lieu de:
    et dans pthread.h, j'ai dû faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //#include <sched.h>
    #include "sched.h"
    Suite à cela, plus de soucis mais j'avoue que c'est du bidoullage sans comprendre ce que je fais, et je suis bien conscient que c'est à éviter.

    Pourriez vous m'expliquer comment inclure cette libraire? Je pense que ca vient de quelque chose que j'ai omis de faire...
    Puis aussi, je ne distingue pas la différence entre:
    et
    Merci, bonne soirée

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par homeostasie
    Puis aussi, je ne distingue pas la différence entre:
    et
    La norme est vague. La première forme recherche un entête d'une manière spécifiée par l'implémentation, la deuxième cherche un fichier d'une manière spécifiée par l'implémentation et s'il ne le trouve pas, recherche un entête comme s'il s'agissait de la première forme.

    En pratique, la différence se résume assez souvent à chercher en plus dans le répertoire du fichier contenant la directive, mais il y a des variations: http://www.bourguet.org/cpp/include.html (je suis toujours intéressé par des cas non décrits dans cette page)

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Par rapport à mon cas particulier, j'utilise devC++. Dans le répertoire de mon projet, j'ai donc copié cette librairie.
    Puis je suis allé sous devC++ dans "option du projet"->onglet "paramètres" et j'ai fait les ajouts suivants:
    - dans "compilateur", j'ai ajouté la ligne suivante: -lpthread
    - dans "éditeur des liens": j'ai inclue la bibiliothèque libpthreadGC1.a

    Est ce bien ainsi qu'il faut régler le compilateur? ou manque t'il des choses à faire?
    J'avais omis de spécifier le répertoire où se trouvait la bibliothèque "libpthreadGC1.a".
    Au passage, que signifie le répertoire d'inclusion?

    Maintenant, mon soucis, quand je compile il n'y a aucune erreur mais quand je l'exécute, j'ai une erreur de segmentation, notamment à l'appel de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pthread_create (&ta, NULL, task_a, NULL);
    Voici le code tiré de la page d'emmanuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    int main (void)
    {
       pthread_t ta;
       pthread_t tb;
     
       puts ("main init");
     
       pthread_create (&ta, NULL, task_a, NULL);
       pthread_create (&tb, NULL, task_b, NULL);
     
    #if 1
       pthread_join (ta, NULL);
       pthread_join (tb, NULL);
    #endif
     
       puts ("main end");
     
       system("PAUSE");
       return 0;
    }
    Si je mets en commentaires les fonctions pthread_XXX, alors pas de plantage.

    Au cas ou, voici la tête de mon Makefile:
    # Project: Thread
    # Makefile created by Dev-C++ 4.9.9.2

    CPP = g++.exe -D__DEBUG__
    CC = gcc.exe -D__DEBUG__
    WINDRES = windres.exe
    RES =
    OBJ = main.o $(RES)
    LINKOBJ = main.o $(RES)
    LIBS = -L"lib" -L"H:/Dev_c++/Thread" libpthreadGC1.a -lpthread -g3
    INCS = -I"include" -I"H:/Dev_c++/Thread" -I"H:/Dev_c++/Thread/pthreads-release"
    CXXINCS = -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32" -I"include/c++/3.4.2" -I"include" -I"H:/Dev_c++/Thread"
    BIN = Thread.exe
    CXXFLAGS = $(CXXINCS) -g3
    CFLAGS = $(INCS) -lpthread -g3
    RM = rm -f

    .PHONY: all all-before all-after clean clean-custom

    all: all-before Thread.exe all-after


    clean: clean-custom
    ${RM} $(OBJ) $(BIN)

    $(BIN): $(OBJ)
    $(CC) $(LINKOBJ) -o "Thread.exe" $(LIBS)

    main.o: main.c
    $(CC) -c main.c -o main.o $(CFLAGS)
    Merci!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Il faut que tu t'assures d'une chose, c'est que tu es quelque part en amont de ton main la définition de la fonction task_a, et task_b, ça doit ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void *task_a(void *param)
    {
    /*ce que doit faire le thread A*/
    }
     
    void *task_b(void *param)
    {
    /*ce que doit faire le thread B*/
    }
    Si non, pour ce qui est du répertoire d'inclusion c'est assez simple.
    Quand tu fait #include "toto.h", le compilo va chercher toto dans le répertoire en cours. Quand tu fait #include <toto.h>, le compilo va chercher toto.h dans tous les répertoire de ta liste des répertoire d'inclusion. Dans ton make file, c'est la variable INCS. De manière générale, se sont les répertoire qui suive l'option -I dans une compilation.

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Il faut que tu t'assures d'une chose, c'est que tu es quelque part en amont de ton main la définition de la fonction task_a, et task_b, ça doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void *task_a(void *param)
    {
    /*ce que doit faire le thread A*/
    }
     
    void *task_b(void *param)
    {
    /*ce que doit faire le thread B*/
    }
    Oui j'ai bien fait cela même si je ne l'ai pas mis dans mon précédent post!

    Merci pour tes explications concernant l'inclusion.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Il y a un autre truc que tu peux essayer...
    Je me rapelle qu'un des prog multi thread que j'avais fait sous linux ne marchait que si je le compilais avec l'option -D_REENTRANT. Ajoute cette option à la compilation.
    Peut être aussi à l'édition des liens, je ne me rapelle plus très bien.

    Normalement -D_REENTRANT est compris dans -lpthread, mais peut êter que ce n'est pas vrai tout le temps...

  7. #7
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Muais, ca ne vient pas de là...
    Je pense que c'est peut être dû à ma configuration de DevC++, un paramètre mal réglé ou omis. Bizarre!
    Le Makefile semble t'il correct par rapport au fait que j'ai ajouté la libraire pour les threads?
    En tout cas, les fonctions sont reconnues car aucunes erreurs à la compilation.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Ormis le -D_REENTRANT ton makefile me semble tout à fait correct. De toute manière si tu avais un souci là dessus, il y a environ 90% de chance que ça plante lors de la compil ou bien de l'édition des liens.
    Si tu veux m'envoyer ton projet par mail, je jetterai un coup d'oeuil...

    a.barral@wanadoo.fr

  9. #9
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Ormis le -D_REENTRANT ton makefile me semble tout à fait correct. De toute manière si tu avais un souci là dessus, il y a environ 90% de chance que ça plante lors de la compil ou bien de l'édition des liens.
    C'est ce que je me dis!

    Sinon, j'ai refait la même manip chez moi (toujours sous DevC++), car je testais cela au travail à mes minutes perdues et bien ca fonctionne très bien...

    Donc demain je vais fermer l'application et la relancer, on verra ce que ca donnera.

    Si tu veux m'envoyer ton projet par mail, je jetterai un coup d'oeuil...
    Merci, j'y penserais si le soucis persiste au boulot. Soit c'est la configuration de DevC++ qui n'est pas au point, soit il suffit de redémarrer l'appli, soit il y a une m...e ailleurs.

    Bonne soirée.

  10. #10
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Donc demain je vais fermer l'application et la relancer, on verra ce que ca donnera.
    Voilà qui est fait! Quand j'ai relancé l'application, compilation ok mais cette fois ci j'ai le message comme quoi il manque une DLL.
    Je la mets donc dans mon fichier courant et plus de soucis, l'appli tourne.

    Mais, ce que je ne saisis pas c'est que je voulais lié statiquement la library au projet et pour cela j'utilisais seulement "libpthreadGC1.a" (placé dans le fichier courant, définit dans l'édition de lien et -lpthread en option dans le compilateur). Résultat, le prog compile mais ne tourne pas, on a l'erreur de segmentation et si je relance DecC++, ca me dit qu'il manque la DLL...

    Par contre en liant dynamiquement avec "pthreadGC1.dll", ca marche, aucun soucis.

    Ceci signifierait il que les libraries "libpthreadGC1.a" ainsi que "libpthreadGCE.a" sont défectueuses?!

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/04/2014, 15h45
  2. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22
  3. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  4. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18
  5. Bibliothèques et documentation
    Par Anonymous dans le forum OpenGL
    Réponses: 4
    Dernier message: 01/04/2002, 12h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo