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