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

Discussion :

QMake et Boost Serialization

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Par défaut QMake et Boost Serialization
    bonjour,
    je pensais en avoir fini avec Boost.Serialization, mais non.
    J'ai compilé Boost_1_54_0 avec MinGW (gcc 4.8.1) et obtenu toute une série de .a (c:/boost_1_54_0/stage/lib/libboost_serialization-mgw48_mt-1_54.a, etc...).
    Je teste ce source:
    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
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    #include <boost/lambda/lambda.hpp>
    #include <boost/lambda/core.hpp>
    #include <boost/archive/text_iarchive.hpp>
    #include <boost/archive/text_oarchive.hpp>
    #include <QString>
    #include <fstream>
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QString filename("serialized.txt");
     
        std::ofstream ofile(filename.toStdString());
        boost::archive::text_oarchive oTextArchive(ofile);  //ligne qui pose pb
    }
    Mon fichier .pro
    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
     
    QT       += core gui
     
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
     
    TARGET = tstBoost
    TEMPLATE = app
     
    SOURCES += main.cpp\
            mainwindow.cpp
     
    HEADERS  += mainwindow.h
     
    FORMS    += mainwindow.ui
     
    INCLUDEPATH += C:/boost_1_54_0
     
    LIBS += -LC:/boost_1_54_0/stage/lib/libboost_serialization-mgw48-mt-1_54
    Le link se passe mal, j'ai quantité d'erreurs du type:
    undefined reference to boost::archive::text_oarchive_impl<boost::archive::text_oarchive>....
    La compilation seule se passe bien.
    Est-ce que la création des .a s'est mal passée? Le .pro n'est pas bon?
    Si quelqu'un a une idée, merci.

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

    Informations professionnelles :
    Activité : aucun

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

    Comme tu l'auras remarqué, boost fourni énormément de versions pour toutes les bibliothèques qu'il propose.

    Si l'on devait s'en tenir à la seule bibliothèque boost_serialization (car c'est celle qui nous intéresse ), on trouverait
    • libboost_serialization-mgw48-1_54.a
    • libboost_serialization-mgw48-1_54.dll.a
    • libboost_serialization-mgw48-d-1_54.a
    • libboost_serialization-mgw48-d-1_54.dll.a
    • libboost_serialization-mgw48-mt-1_54.a
    • libboost_serialization-mgw48-mt-1_54.dll.a
    • libboost_serialization-mgw48-mt-d-1_54.a
    • libboost_serialization-mgw48-mt-d-1_54.dll.a
    • libboost_serialization-mgw48-s-1_54.a
    • libboost_serialization-mgw48-s-1_54.dll.a
    • libboost_serialization-mgw48-sd-1_54.a
    • libboost_serialization-mgw48-sd-1_54.dll.a
    Chaque version présente sa propre particularité, et les différentes parties qui constituent le nom te permettent de savoir quelle version correspond à quoi.

    Ainsi:
    • si tu trouve ".dll" dans le nom, c'est une bibliothèque d'importation qui te permet d'utiliser la dll
    • si tu trouves "-mt" dans le nom, c'est la version "multithread"
    • si tu trouve "d" dans le nom, c'est la version "debug"
    • si tu trouve "s" dans le nom, c'est la version "singlethread" (je crois)
    Un certain nombre de symboles préprocesseurs sont définis (ou plutôt, ne sont PAS définis) afin de permettre aux fichiers d'en-tête de s'adapter aux différentes possibilités, dont tu trouveras la liste complète dans le fichier config/user.hpp

    Parmi ces symboles non définis, il y a un symbole BOOST_ALL_NO_LIB qui indique, lorsqu'il a une valeur égale à 1, qu'il faut utiliser les versions statiques des différentes bibliothèque (donc utiliser les bibliothèques dans lesquelles n'apparaissent pas le fameux ".dll")

    Comme ce symbole n'est PAS défini, cela signifie que, par défaut, tout le code de boost prévoit de travailler avec les bibliothèques dynamiques (les dlls, si tu préfères )

    Or, tous les symboles exportés par les dlls ont des noms beacoup plus complexes que ceux qui peuvent servir lorsqu'il s'agit d'utiliser une bibliothèque statique: ils sont composés de glyphes sympa comme @ et autres joyeusetés.

    Du coup, l'éditeur de liens devient incapable de se rendre compte qu'un symbole qui apparait dans la version statique de la bibliothèque correspond au symbole dont il connait le nom adapté à une bibliothèque dynamique, et il t'indique qu'il n'arrive pas à le retrouver

    Tu as donc deux solutions possibles:

    Soit, tu utilises la version dll de la bibliothèque (libboost_serialization-mgw48-mt-1_54.dll), mais cela implique que tu devras fournir la dll correspondante (plus peut etre une ou deux auquelles cette dll fait appel) avec ton application

    Soit tu définis le symbole BOOST_ALL_NO_LIB à un dans les options de compilation de ton projet.

    Cela se fait assez simplement au niveau du fichier pro en rajoutant la ligne
    DEFINES+= BOOST_ALL_NO_LIB=1

    Notes que si tu le fais au niveau global, toutes les bibliothèques de boost que tu utilises seront liées statiquement.

    Il faudra peut etre, selon tes propres nécessités, affiner un tout petit peu ce genre de réglage
    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

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