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 friend declaration refusée


Sujet :

Boost C++

  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 boost friend declaration refusée
    bonjour,
    je veux utiliser Boost::serialization et je m'inspire directement des exemples de la doc.
    Pour mon .h:
    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 <boost/serialization/version.hpp>
    //#include <boost/serialization/serialization.hpp>
    //#include <boost/serialization/access.hpp>
     
    class C_ObjGraphic
    {
    private:
        friend class boost::serialization::access;
     
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version) {
        }
     
    public:
        C_ObjGraphic(QColor);
        virtual ~C_ObjGraphic();
    };
     
    BOOST_CLASS_VERSION(C_ObjGraphic, 1)
    Mon .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
    19
    20
    21
    22
     
    QT       += core gui
     
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
     
    TARGET = tstBoostBis
    TEMPLATE = app
     
    DEFINES += BOOST_THREAD_USE_LIB
     
    SOURCES += main.cpp\
            mainwindow.cpp \
        c_objgraphic.cpp \
    
    HEADERS  += mainwindow.h \
        c_objgraphic.h \
    
    FORMS    += mainwindow.ui
     
    INCLUDEPATH += C:/boost_1_52_0
     
    LIBS += C:/boost_1_52_0/stage/lib/libboost_serialization-vc100-mt-gd-1_52.lib
    A la compil, j'ai toujours l'erreur:
    'access' in namespace 'boost::serialization' does not name a type
    friend declaration does not name a class or function

    Ma déclaration d'amitié me semble correcte!
    Une idée??

    Merci.

  2. #2
    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 rdtech Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //#include <boost/serialization/access.hpp>
    Hello,

    access doit être inclus.

    Ça devrait marcher en dé-commentant cette ligne.

  3. #3
    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
    bonjour,
    OK merci, je suis passé à côté.
    Ayant recopié intégralement l'exemple de la doc Boost, c'est truffé d'erreurs et je commente/décommente pour essayer de déterminer qui pose problème.

    En fait, j'ai commencé par écrire une méthode sauver() dans mon mainwindow.cpp et compilé pour voir ce que ça donnait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void MainWindow::sauver()
    {
        //Ouvrir une boîte de dialogue et récupérer le nom du fichier
        QString fileName = QFileDialog::getSaveFileName(this, tr("Enregistrement du scénario"), QDir::currentPath(), tr("Scenario (*.sce)"));
     
        std::ofstream ofs("fichier de scénario sérialisé", std::ofstream::out);
     
        boost::archive::text_oarchive oa(ofs);
        oa << "test";
        ofs.close();
    }
    en incluant #include <boost/archive/text_oarchive.hpp> en tête.
    C'est là que j'ai 54 erreurs et 51 warning pour cette seule méthode:
    C:\boost_1_52_0\boost\archive\text_oarchive.hpp:100: erreur : undefined reference to `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::text_oarchive_impl(std::ostream&, unsigned int)'
    Je décode qu'il y a plein de choses que le compilateur ne voit pas dans les fichiers hpp de la lib serialization ce qui me semble très étonnant.
    Ne comprenant pas ce qui se passe (je ne vois qu'un souci d'include...), je tâtonne en attendant un coup de main.

    Merci.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Courage, c'est une erreur d'édition des liens, tu es donc très proche de la fin

    undefined reference veut dire qu'il a la déclaration du symbole (= dans le .h) mais pas la définition (= .a .lib .dll)

    En gros, il faut passer à ton compilateur une option -lboost_NomLib pour lui dire d'aller rechercher les fonctions nécessaires dans les .lib .dll .a de la bibliothèque boost.

    Après pour trouver la bonne option... tu dois avoir des choses comme :
    -lboost_system -lboost_network -lboost_serial (?)
    Essaye de regarder sur google avec ton message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIBS += C:/boost_1_52_0/stage/lib/libboost_serialization-vc100-mt-gd-1_52.lib
    Jamais de chemins absolus comme ça
    Rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIBDIR += C:/boost_1_52_0/stage/lib/
    si tu veux (= à ne modifier qu'une seule fois même si on a plusieurs "sous-biblithèques" de boost).

    Après, comme tu semble être sous QtCreator, je te recommande très vivement d'utiliser un CMakeLists.txt avec un projet CMake sous QtCreator, c'est tellement puissant comme truc

  5. #5
    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
    Bonjour et merci pour les remarques.

    Je suis revenu à une machine 32 bits sous XP (originellement, j'ai un PC 64 bits sous Windows 8) mais ce sont strictement les mêmes erreurs. Je pensais éventuellement à un problème de compilation 32 vs 64 bits de Boost.

    Donc j'en suis toujours au même point...

  6. #6
    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
    Bonjour,
    il me reste 7 erreurs à éradiquer.
    J'ai modifié le .pro comme suit pour y arriver:
    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
     
    QT       += core gui
     
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
     
    TARGET = boostSerialize
    TEMPLATE = app
     
    SOURCES += main.cpp\
            mainwindow.cpp \
        c_objgraphic.cpp
     
    HEADERS  += mainwindow.h \
        c_objgraphic.h
     
    FORMS    += mainwindow.ui
     
    INCLUDEPATH += C:/boost_1_54_0
     
    LIBS += -LC:/boost_1_54_0/stage/lib -lboost_serialization-mgw48-1_54
    J'ai rajouté -lboost_serialization-mgw48-1_54 dans LIBS

    Il me reste toujours les mêmes erreurs du genre:

    C:\boost_1_54_0\boost\archive\basic_text_oprimitive.hpp:91: erreur : undefined reference to `boost::archive::archive_exception::archive_exception(boost::archive::archive_exception::_exception_code, char const*, char const*)'

    Je n'inclus pourtant pas ce basic_text_oprimitive.hpp dans mes sources..

    Sinon, les dll doivent elles rester dans le répertoire des .a ?

    Merci

  7. #7
    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
    pffffff!! et ben c'était pas de la tarte...

    j'avais des lib du genre:
    libboost_serialization-mgw44-mt-1_52 qui venaient d'un vieux projet sous Code Blocks certainement avec un compilateur gcc en version 4.4 (ce que j'ai fini par comprendre.)
    Qt embarque un gcc en version 4.8 ce qui pose apparemment un problème de compatibilité.
    Donc recompilation de Boost avec le compilateur de Qt et ça fonctionne!!!

    Enfin, je n'ai plus d'erreurs de compilation. On va voir ce que ça donne en avançant dans le projet...

    A+

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

Discussions similaires

  1. Declaration d'un intervalle avec bibliothéque boost
    Par NGeVtC87 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 25/11/2011, 14h00
  2. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51
  3. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37
  4. Declaration Type ds une procedure
    Par Qwazerty dans le forum Langage
    Réponses: 6
    Dernier message: 28/08/2002, 09h09
  5. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07

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