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

Visual C++ Discussion :

Problème étrange link-operateur - std::string::operator<< (error lnk2005)


Sujet :

Visual C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Points : 65
    Points
    65
    Par défaut Problème étrange link-operateur - std::string::operator<< (error lnk2005)
    Bonjour à vous !

    Je viens de rencontrer un problème particulièrement étrange :

    Il semblerait qu'une ligne dans un fichier VideoGenerator.cpp soit responsable d'une erreur de linkage. La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z) déjà défini(e) dans revel.lib(revelcore.obj)
    Manifestement, problème de conflit entre msvcprt.lib et revel.lib...

    Or, en changeant la ligne dans le fichier dont je vous parlais plus haut, cette erreur disparait !

    La ligne en question se trouve être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Fichier : " << this->nomFichierVideo << endl;
    L'attribut nomFichierVideo est de type std::string. Apparement, ça lui pose problème à l'opérateur << que je lui passe un type string. Si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Fichier : " << this->nomFichierVideo.c_str() << endl;
    à la place, je n'ai plus le problème de link.


    Mon projet ne comporte que quelques fichiers :
    • FicMain.cpp : fichier qui contient la fonction main
    • revel.h et revel.lib (une librairie récupérée sur le net pour générer des vidéos)
    • VideoGenerator.h et VideoGenerator.cpp (fichier incriminé!) > une classe qui fait interface entre revel et mon main.


    Manifestement, le problème est lié à la classe std::string... Donc voilà ce que contient mon VideoGenerator.h, ça peut peut-être vous faire comprendre le problème :

    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
    #ifndef _VIDEOGENERATOR_
    #define _VIDEOGENERATOR_
     
    #include <iostream>
    #include <string>
     
    #include <windows.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glut.h>
     
    #include "revel.h"
     
    using namespace std;
     
    class VideoGenerator
    {
    	public:
     
    		/**
                     * Type d'enregistrement
                     */
    		enum VG_Mode {
    			VG_MODE_TPSREEL = 0,
    			VG_MODE_FICHIERS,
    		};
     
    		/**
                     * Type d'enregistrement
                     */
    		enum VG_Etat {
    			VG_ETAT_DEPART = 0,
    			VG_ETAT_EN_COURS,
    			VG_ETAT_FINI
    		};
     
    		// Plusieurs constructeurs
    		VideoGenerator(int _w, int _h, string _nomFic, int _nbMaxImages, int _f, VG_Mode _m) throw (string) ;
     
    		~VideoGenerator(void);
     
    		void demarreEnregistrement() throw (string) ;
    		void enregistreImage() throw (string) ;
    		void stopEnregistrement() throw (string) ;
     
    		VG_Etat getEtat();
     
     
    	protected:
     
    		/*
    		* Attributs de la classe
    		*/
    		int width;					// Largeur de la vidéo
    		int height;					// Hauteur de la video
    		string nomFichierVideo;		// Nom fichier à créer (ou écraser)
    		int frameRate;				// Nombre d'images par seconde
    		VG_Mode modeEnregistrement;	// Mode d'enregistrement (temps réel, deux temps : enregistrement des images sur le DD puis création d'une vidéo)
    		int nbMaxImages;			// Nombre maximum d'images possible dans une vidéo (pour éviter les problèmes mémoire)
    		VG_Etat etat;				// Etat de l'enregistreur (départ, en cours, fini)
     
    		int nbImages;				// Nombres d'images enregistrées
     
    		/**
                    * Attributs relatifs à REVEL
                    */
    		int encoderHandle; // identifiant de l'encodeur
    		Revel_VideoFrame videoFrame;
     
    		/**
                    * Valeurs par défaut des paramètres du constructeur
                    */
    		static const int		VG_DEFAULT_NB_MAX_IMAGES	= 450;
    		static const int		VG_DEFAULT_FRAME_RATE		= 30;
    		static const VG_Mode	VG_DEFAULT_MODE				= VG_MODE_TPSREEL;
    };
     
    #endif // _VIDEOGENERATOR_
    Donc rien de bien méchant a priori...

    Mon fichier main a un #include "VideoGenerator.h", donc il n'inclut pas revel directement.

    J'ai certes trouvé le moyen d'esquiver cette erreur mais je ne comprends pas pourquoi je l'avais au niveau du link d'une part, et surtout pourquoi le compilo me disait que ça provenait de revel.h ! Et je suis curieux ^^

    Si je n'ai pas été clair, je peux réexpliquer certains points.

    Merci de bien vouloir m'expliquer ce qui se passe si vous y comprenez quelque chose ou avez déjà vécu cela.

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Points : 65
    Points
    65
    Par défaut
    Je viens de me rendre compte que je pouvais rencontrer cette même erreur par ailleurs en faisant cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    		enregistreur.demarreEnregistrement();
    	}
    	catch(string message) {
    		cerr << "Exception dans init : " << message << endl;
    	}
    message est de type std::string. (En haut du fichier, j'ai fais un using namespace std;)

    Si je mets message.c_str() à la place, ça fonctionne !

    Quelqu'un peut me dire comment je suis sensé utiliser ce foutues chaînes de caractères ?!

Discussions similaires

  1. Problème avec std::string
    Par Laughing Man dans le forum C++
    Réponses: 18
    Dernier message: 07/02/2008, 19h04
  2. Problème Cast char* en std::string
    Par inovah dans le forum SL & STL
    Réponses: 1
    Dernier message: 30/10/2007, 16h32
  3. Problème std::string et operator <<
    Par jomeo dans le forum SL & STL
    Réponses: 2
    Dernier message: 21/02/2007, 11h36
  4. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54
  5. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07

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