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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    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
    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 confirm�
    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
    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