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

Threads & Processus C++ Discussion :

Problèmes Boost et Eclipse (et MinGW ?)


Sujet :

Threads & Processus C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Problèmes Boost et Eclipse (et MinGW ?)
    Bonjour à tous, je réclame votre aider pour comprendre et résoudre des problèmes en rapport avec la bibliothèque boost (et peut être aussi MinGW) que j'ai dans mon programme traitant des threads.

    Voilà le programme :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
     
    #include <iostream>
    #include <sstream>
    #include <vector>
     
    #include <boost/thread/thread.hpp>
     
    #include "nsUtil.h"         // Rand()
     
    using namespace std;
    using namespace boost;
    using namespace boost::posix_time; // time_duration
     
    using namespace nsUtil;
     
     
     
    enum { KErrArg  = 253 };    // Erreur d'arguments de main()
    typedef unsigned long long ULL_t;
    typedef long long LL_t;
     
    namespace
    {
    	LL_t a = 0;
    	ULL_t NbBoucles;
     
        void Incr (void)
        {
        	for (int i (0); i <= NbBoucles; ++i)
        		++a;
        } // Incr ()
     
        void Decr (void)
        {
        	for (int i (0); i < NbBoucles; ++i)
        		--a;
        } // Decr ()
     
    } // namespace anonyme
     
    int main (int argc, char * argv [])
    {
        if (argc != 3)
        {
             cerr << "Usage : ThreadsEtDelais <NbThreads> <NbBoucles>\n";
             return KErrArg;
        }
        unsigned NbThreads;
        {
             istringstream is (argv [1]);
             is >> NbThreads;
        }
     
        istringstream is2 (argv [2]);
        is2 >> NbBoucles;
     
        cout << "Nbre de threads : " << NbThreads << '\n';
     
        vector <thread *> VThreads;
     
        for (unsigned i = NbThreads; i--; )
        {
             VThreads.push_back (new thread (Incr));
             VThreads.push_back (new thread (Decr));
        }
     
        this_thread::sleep (seconds(1));
     
        time_duration td = seconds(2);
        for (unsigned i = NbThreads; i--; )
        {
             cout << "Attend la fin du thread de rang " << i << ' '
                  << " et d'ID " << VThreads[i]->get_id();
     
             cout << (VThreads[i]->timed_join (td) ?     " fini\n"
                                                   : " pas fini\n");
        }
     
        cout << a;
        return 0;
     
    } // main()
    et voilà les erreurs apparaissant dans CDT Build Console :

    src\Concurrence_a.o:Concurrence_a.cxx:(.text$_ZN5boost6detail11thread_dataIPFvvEED1Ev[__ZN5boost6detail11thread_dataIPFvvEED1Ev]+0x7): undefined reference to `_imp___ZN5boost6detail16thread_data_baseD2Ev'

    src\Concurrence_a.o:Concurrence_a.cxx:(.text$_ZN5boost6detail11thread_dataIPFvvEED0Ev[__ZN5boost6detail11thread_dataIPFvvEED0Ev]+0xe): undefined reference to `_imp___ZN5boost6detail16thread_data_baseD2Ev'

    c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: src\Concurrence_a.o: bad reloc address 0xe in section `.text$_ZN5boost6detail11thread_dataIPFvvEED0Ev[__ZN5boost6detail11thread_dataIPFvvEED0Ev]'

    collect2.exe: erreur: ld a retourné 1 code d'état d'exécution


    J'utilise l'IDE Eclipse pour C/C++ Developers sous Windows 8, avec le compilateur MinGW et la version de ma bibliothèque Boost est 1_52_0

    Je pense que mon problème viens des linkages dans les propriétés de mon projet... Voilà ceux que j'ai réalisé :

    C/C++ Build -> Settings -> GCC C++ Compiler -> Includes -> Include paths -> C\Boost\boost_1_52_0

    C/C++ Build -> Settings ->MinGW C++ Linker -> Libraries -> Libraries search path -> C:\Boost\boost_1_52_0

    C/C++ General -> Path and Symbols -> Includes -> GNU C++ -> C:\Boost\boost_1_52_0


    Merci d'avance de votre aide !

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    j'imagine que ces trois chemins sont respectivement "C:\Boost\boost_1_52_0\include", "C:\Boost\boost_1_52_0\lib" et "C:\Boost\boost_1_52_0\include"
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    As tu compilé Boost?, car la bibliothèques boost::thread n'est pas header-only.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    leternel : Le premier et denier link sont bien dans C:/Boost/boost_1_52_0/boost et le deuxième dans C:/Boost/boost_1_52_0/libs

    backlash : Comment puis-je compiler boost ?

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En allant sur le site officiel et en suivant les instructions d'installation, ou encore, en téléchargeant la lib précompilée.

    Boost utilise boost.jam, qui joue le rôle de make, il est donc utile d'aller sur leur site
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    J'ai compilé boost à l'aide de bjam, et donc changé C:/Boost/boost_1_52_0/libs par C:/Boost/boost_1_52_0/lib et ces arreurs m'apparaissent :

    src\nsUtil.o:nsUtil.cxx.text.startup+0x1a): undefined reference to `boost::system::generic_category()'

    src\nsUtil.o:nsUtil.cxx.text.startup+0x24): undefined reference to `boost::system::generic_category()'

    c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: src\nsUtil.o: bad reloc address 0x24 in section `.text.startup'
    collect2.exe: erreur: ld a retourné 1 code d'état d'exécution

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    En gros, il y a deux choses à faire pour utiliser correctement boost:
    1- Compiler les bibliothèques qui nécessitent de l'être, dont boost-threads.

    Cela se fait, en général, en deux étapes :
    1.a- compiler bjam (maintenant aussi connu sous le nom de b2) grace au fichier "bat" qui est fournis dans le dossier racine des sources de boost.

    Il "suffit", dans une ligne de commandes pour laquelle on a pris soin de s'assurer que la variable path connait le chemin d'accès à mingw (un simple gcc -v doit donner une réponse autre que "gcc commande inconnue" ) de lancer la commande
    1.b compiler l'ensemble des bibliothèques de boost, avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b2 --toolset=mingw --build-type=complete install
    qui compilera l'ensemble des bibliothèques et qui installera par défaut les fichiers d'en-tête dans c:\boost\inlude\boost_<version>(\boost) et les bibliothèques dans c:\boost\libs.

    Une fois cela fait, tu pourras utiliser boost.

    Pour que le compilateur puisse retrouver les fichiers d'en-têtes, il faudra faire en sorte qu'il aille les chercher dans c:\boost\include\boost<version>, en ajoutant l'option de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Ic:\boost\include\boost_1_51
    (par exemple, vu que c'est la version actuelle de boost )

    Note que c'est un i majuscule

    Pour que le compilateur (en fait, l'éditeur de liens ) puisse retrouver les bibliothèques de boost dont il a besoin, il faut rajouter les options
    pour qu'il sache où aller les chercher et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -lboost_nomBibliothèque_Flavour
    pour qu'il sache qu'il doit utiliser ce qu'il trouvera dans nomBibliothèque.

    Note que c'est un L minuscule

    Pour linker correctement boost-thread avec ton projet, la commande de link pourrais donc ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Lc:\boost\lib -libboost_thread-mgw47-mt-sd-1_51
    mt indiquant ici qu'il va utiliser la version "multi-thread" et sd indiquant qu'il va utiliser la version statique (pas la dll, donc) de débuggage

    Tu peux, bien sur, décider d'utiliser n'importe quelle autre version (mono ou multi thread, statique ou dynamique, debug ou non )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci pour cette réponse koala01, j'ai suivis tes directives et les links semblent marcher.

    Mais de nouvelles erreurs interviennent (ça ne s'arrête plus...) :

    déréférencement du pointeur type-punned brisera les strictes d'aliases [-Wstrict-aliasing] line 52, external location: C:\Boost\boost_1_52_0\boost\thread\win32\shared_mutex.hpp

    déréférencement du pointeur type-punned brisera les strictes d'aliases [-Wstrict-aliasing] line 53, external location: C:\Boost\boost_1_52_0\boost\thread\win32\shared_mutex.hpp

    Après une recherche sur internet j'ai trouver cette solution : rajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
    mais cela ne change strictement rien...

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    UP !

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    UP....

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Juste pour préciser que j'ai résolu le problème, en fait le define fonctionne, il suffisait juste que je le place avant la déclaration des "#include <****>"

    Merci de votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Eclipse][Mémoire] Problème de configuration Eclipse ?
    Par stongolm dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 16/12/2010, 21h08
  2. [Eclipse + CDT + MinGW] Problème de compilation
    Par liberio dans le forum Eclipse C & C++
    Réponses: 2
    Dernier message: 03/12/2008, 01h38
  3. [Debutant(e)]Problème d'installation (eclipse 3.0.2 et CDT)
    Par Samemax dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 10/05/2005, 19h49
  4. Problème maj de eclipse 3.0RC3
    Par phileme dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 04/07/2004, 12h58
  5. [Core]Problème au démarrage eclipse...
    Par SpeCiE dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 01/07/2004, 09h23

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