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

Boost C++ Discussion :

boost.serialization et ifstream : incompatibilité ?


Sujet :

Boost C++

  1. #1
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut boost.serialization et ifstream : incompatibilité ?
    Hello,

    (boost 1.50.0, VS2012 CTP november)

    Y a t-il une incompatibilité entre boost.serialization et fstream ?

    J'ai un projet qui utilise la sérialisation sans problème (appli client/serveur), mais si je crée un objet std::ifstream quelques part, je me retrouve avec des erreurs de link bizarres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3>libboost_serialization-vc110-mt-gd-1_50.lib(basic_text_iprimitive.obj) : error LNK2005: "public: static unsigned int __cdecl std::codecvt<char,char,int>::_Getcat(class std::locale::facet const * *,class std::locale const *)" (?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z) déjà défini(e) dans msvcprtd.lib(MSVCP110D.dll)
    3>libboost_serialization-vc110-mt-gd-1_50.lib(basic_text_oprimitive.obj) : error LNK2005: "public: static unsigned int __cdecl std::codecvt<char,char,int>::_Getcat(class std::locale::facet const * *,class std::locale const *)" (?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z) déjà défini(e) dans msvcprtd.lib(MSVCP110D.dll)
    Google n'est pas très bavard à ce sujet, ça parle de paramètres de link du CRT différent pour le projet et boost.
    Multithread et debug multithread (/MT et /MTd) => libs de boost manquantes. (ce qui tend à indiquer que je les ai build en /MD et /MDd, mais à vrai dire je sais pas, j'ai aucune idée d'à quoi ça correspond ^^")
    DLL Multithread et DLL debug multithread (/MD et /MDd) => ces erreurs de link.

    Bref j'suis un peu perdu, quelqu'un sait d'ou ça peut venir ?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 637
    Par défaut
    Salut,

    Ca, ca me semble typiquement du au même flag qui décide s'il faut utiliser dllexport ou dllimport.

    Bien souvent, c'est de l'ordre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef BUILD_DLL
        #define DLL_API __declspec(dllexport)
    #else 
       #define DLL_API __declspec(dllimport
    #endif
    Comme je ne te vois pas trop bien aller modifier les sources de microsoft, je te conseillerais d'essayer de trouver l'endroit où se cache ce test du coté de boost.serialization (sans doute dans le config.h, tiens ) et de voir si tu arrives à le modifier partout où ce serait nécessaire

    Au fait, tu sais qu'on en est à la version 1_54 de boost

    Je serais vraiment surpris si un truc aussi gênant n'avait pas été résolu depuis belle lurette
    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

  3. #3
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ca, ca me semble typiquement du au même flag qui décide s'il faut utiliser dllexport ou dllimport.
    Liaison statique à boost, ça vient pas de là.
    Citation Envoyé par koala01 Voir le message
    Au fait, tu sais qu'on en est à la version 1_54 de boost
    J'avais un peu la flemme de rebuild boost en fait

    Problème résolu avec la version 1.54.
    (Mais j'ai du me chier dans les options de build, il m'a éparpillé les libs dans ~490 dossiers )

    En tout cas bizarre que Google n'ai pas entendu parlé du problème, je peux pas être le seul à qui s'est arrivé quand même.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 637
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Liaison statique à boost, ça vient pas de là.
    J'avais un peu la flemme de rebuild boost en fait
    Ou peut etre est ce que ca vient de ton code : Un truc qui appelle un truc qui appelle un truc, et ca casse au niveau de boost.serialize parce que c'est là que tout se rejoint

    Honnêtement, si notre ami à tous n'en a jamais entendu parler, je pencherais volontiers d'avantage pour cette solution plutot que d'accuser boost
    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

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Honnêtement, si notre ami à tous n'en a jamais entendu parler, je pencherais volontiers d'avantage pour cette solution plutot que d'accuser boost
    Ce code (exemple de boost)
    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
    #include <fstream>
     
    // include headers that implement a archive in simple text format
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
     
    /////////////////////////////////////////////////////////////
    // gps coordinate
    //
    // illustrates serialization for a simple type
    //
    class gps_position
    {
    private:
    	friend class boost::serialization::access;
    	// When the class Archive corresponds to an output archive, the
    	// & operator is defined similar to <<.  Likewise, when the class Archive
    	// is a type of input archive the & operator is defined similar to >>.
    	template<class Archive>
    	void serialize(Archive & ar, const unsigned int version)
    	{
    		ar & degrees;
    		ar & minutes;
    		ar & seconds;
    	}
    	int degrees;
    	int minutes;
    	float seconds;
    public:
    	gps_position(){};
    	gps_position(int d, int m, float s) :
    		degrees(d), minutes(m), seconds(s)
    	{}
    };
     
    int main() {
    	// create and open a character archive for output
    	std::ofstream ofs("filename");
     
    	// create class instance
    	const gps_position g(35, 59, 24.567f);
     
    	// save data to archive
    	{
    		boost::archive::text_oarchive oa(ofs);
    		// write class instance to archive
    		oa << g;
    		// archive and stream closed when destructors are called
    	}
     
    	// ... some time later restore the class instance to its orginal state
    	gps_position newg;
    	{
    		// create and open an archive for input
    		std::ifstream ifs("filename");
    		boost::archive::text_iarchive ia(ifs);
    		// read class state from archive
    		ia >> newg;
    		// archive and stream closed when destructors are called
    	}
    	return 0;
    }
    Me donne les mêmes erreurs de link avec boost 1.50, mais link correctement avec la version 1.54.

    Donc je ne pense pas que ça vienne de mon code, peut être de la config de mon projet (mais exactement la même config avec la version 1.54)

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/08/2007, 21h05
  2. Boost::Serialize
    Par Rodrigue dans le forum Bibliothèques
    Réponses: 19
    Dernier message: 26/07/2007, 16h09
  3. Librairie boost::serialization + vector : possible ?
    Par zax-tfh dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 07/01/2006, 14h15
  4. boost::serialize
    Par Fry dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 05/11/2004, 18h03

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