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 :
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 :
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 :
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 :
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.
Partager