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

SL & STL C++ Discussion :

[LNK]erreurs avec std::tr1::regex


Sujet :

SL & STL C++

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut [LNK]erreurs avec std::tr1::regex
    Bonjour à tous!

    Bon, j'espère ne pas me tromper de section en postant ça ici...

    Dans un projet développé avec VS2008; j'ai besoin d'utiliser dans une fonction les expressions régulières. Ma fonction ressemble à ceci (elle n'est pas très propre pour le moment mais là n'est pas la question ) :

    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
     
    #include <regex>
     
    [...]
     
    CTime CTime(string sTime)
    {
        std::tr1::match_results<string::const_iterator> sResult;
     
        const std::tr1::regex pattern("^([0-9]{4})-?([0-9]{1,2})-?([0-9]{1,2})T([0-9]{1,2}):?([0-9]{1,2}):?([0-9]{1,2})[\\.,\\,]?([0-9]*)(Z|([-,+])([0-9]{1,2}):?([0-9]{1,2}))$");
     
        bool match = std::tr1::regex_match(sTime, sResult, pattern);
     
        if (match)
        {        
            CTime ctTime(
                To_int(sResult[1]),
                To_int(sResult[2]),
                To_int(sResult[3]),
                To_int(sResult[4]),
                To_int(sResult[5]),
                To_int(sResult[6]),
                -1);
            return ctTime;
        }
     
        CTime ctTime (0);
        return ctTime;
    }
    Bref, le problème est qu'à la compilation, j'ai les erreurs suivantes :

    Error 1 error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl std::tr1::_Xbad(enum std::tr1::regex_constants::error_type)" (__imp_?_Xbad@tr1@std@@YAXW4error_type@regex_constants@12@@Z) referenced in function "public: static unsigned int __cdecl std::tr1::_Regex_traits<char>::length(char const *)" (?length@?$_Regex_traits@D@tr1@std@@SAIPBD@Z) gpx_parser.obj Vts Acquisition

    Error 2 error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl std::tr1::_Xmem(void)" (__imp_?_Xmem@tr1@std@@YAXXZ) referenced in function "private: void __thiscall std::tr1::_Buf<char>::_Expand(int)" (?_Expand@?$_Buf@D@tr1@std@@AAEXH@Z) gpx_parser.obj Vts Acquisition

    Error 3 fatal error LNK1120: 2 unresolved externals ..\..\bin\debug/Acquisitiond.dll Vts Acquisition
    J'avoue être un peu perdu... Si quelqu'un a une idée...

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 681
    Points : 188 884
    Points
    188 884
    Par défaut
    Bonjour,

    Les regex sont une des rares parties de Boost à devoir être compilées, tu dois lier avec un .lib (d'où les erreurs que tu rencontres).

    C'est pourquoi il tu dois compiler Boost (entièrement, il y a d'autres parties qui sont aussi intéressantes), puis lier avec lui.

    Sur le site de BoostProComputing tu trouveras Boost 1.38 compilé pour Visual Studio (plus d'infos sur le sujet : http://arb.developpez.com/c++/boost/install/vc++/). Si tu as besoin de la 1.39, tu peux la compiler toi-même (pour plus d'infos : http://ram-0000.developpez.com/tutor...pp/boost-regex).

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    J'avais compris qu'en utilisant ça (std::tr1) je n'utilisais pas Boost. Non?

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 681
    Points : 188 884
    Points
    188 884
    Par défaut
    Personnellement, je ne connais pas de librairie standard qui intègre le support des expressions régulières (mais je ne passe pas tous les jours pour le vérifier, vu que Qt les supporte...) pour le moment, j'ai donc pensé que tu utilisais Boost...

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    J'ai essayé ce que tu m'as conseillé mais ça n'a rien changé. Je ne pense pas qu'il y ait de lien avec Boost mais d'après ce que j'ai cru comprendre, TR1 est pour le moment la seule solution pour faire des regex avec la STL.

    Je vais p-e voir aussi du côté de Boost.

    Peut-être une autre idée?

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par dourouc05 Voir le message
    Personnellement, je ne connais pas de librairie standard qui intègre le support des expressions régulières (mais je ne passe pas tous les jours pour le vérifier, vu que Qt les supporte...) pour le moment, j'ai donc pensé que tu utilisais Boost...
    Sisi le TR1 intégre les regex. Et bien sur c'est basé sur ceux de boost. Pour les erreurs de linker, n'utilisant pas VS je peux pas trop t'aider.

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 681
    Points : 188 884
    Points
    188 884
    Par défaut
    Après une petite recherche, j'ai trouvé que le TR1 était inclus dans le Feature Pack de VS2008. Cependant, il n'est pas censé compatible avec les versions non anglaises de VS, ni avec le SP1... Peut-être est-ce que ça vient de là ? (Ça m'étonnerait, mais on ne sait jamais...). Il est de toute façon inclus dans VS2010.

    Donc, as-tu installé le FP ? Lies-tu bien avec lui ? (Ne l'ayant jamais utilisé, je ne m'aventurerai pas plus loin).

  8. #8
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    J'ai uniquement fait l'include. Comme ça fait partie de la STL, l'include devrait suffire j'imagine?
    L'include seul ne génère aucune erreur. Les erreur apparaissent lorsque je déclare un "const std::tr1::regex"...
    Il faut peut-être ajouter des "__declspec(dllimport) [...]" dans le code mais je vois pas trop quoi ni comment...

    En tous cas, merci pour vos réponses

  9. #9
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Bon... ça fonctionne en utilisant Boost. Le code est exactement le même si ce n'est le "préfixe" std::tr1 à changer en boost:: et bien entendu l'include à modifier.

    Je reste quand même curieux quant à l'erreur de linkage en utilisant le TR1... Je pense conserver le code utilisant Boost mais je met de côté la version TR1 pour quand même tenter de la faire fonctionner!

    Donc j'attend vos idées et je continue à chercher de mon côté

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Pour info, j'ai écrit le code suivant inspiré du tiens avec Visual C++ 2008 SP1, et partant du template "projet vide" :

    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
    #include <regex>
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        std::tr1::match_results<string::const_iterator> sResult;
     
        const std::tr1::regex pattern("^([0-9]{4})-?([0-9]{1,2})-?([0-9]{1,2})T([0-9]{1,2}):?([0-9]{1,2}):?([0-9]{1,2})[\\.,\\,]?([0-9]*)(Z|([-,+])([0-9]{1,2}):?([0-9]{1,2}))$");
     
    	string s = "12-32";
    	bool match = std::tr1::regex_match(s, sResult, pattern);
     
        if (match)
        {
    		cout << sResult.size() << endl;
        }
    }
    Et tout compile et link bien chez moi, sans rien changer aux options de compilation.

  11. #11
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Arg!

    Bon, du coup ça doit venir d'un paramétrage quelconque de Visual Studio j'imagine... Je suis aussi sous VC++ 2008 SP1 mais je ne suis pas parti d'un projet vide. Cette fonction fait partie d'une classe ajoutée à un (très) gros projet existant. Il y a peut-être quelque chose à voir de ce côté là alors (propriétés du projet, conflits dans les include, ou autre). Je vais regarder de ce côté là voir si j'ai pas quelque chose de douteux...

Discussions similaires

  1. Erreur avec std::thread (C++11)
    Par gbdivers dans le forum Qt Creator
    Réponses: 0
    Dernier message: 14/08/2012, 11h09
  2. erreur avec regex ou listview
    Par cleecky dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/06/2011, 14h51
  3. Erreur avec Typedef et std
    Par leCcsympas dans le forum SL & STL
    Réponses: 2
    Dernier message: 16/04/2007, 20h43
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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