[library] OpenGL pour Borland C++ Builder

Résolu/Fermé
Wanou Messages postés 3 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 3 août 2006 - 1 août 2006 à 21:26
Wanou Messages postés 3 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 3 août 2006 - 3 août 2006 à 05:05
Bonjour a tous !
Je suis nouveau sur le forum

Alors voila depuis plusieurs mois je programme en c++
J'utilise le compilateur Borland c++ builderX jusque la pas de probleme lol
J'es créer un nouveau projet "console" et ajouter un fichier source c++
avec les en-tet necessaire ensuite j'es compiler et la 26 erreur du style
""gl.h" : E2238 Déclaration multiple pour 'WINGDIAPI' en ligne 1208"
Avec le fichier gl d'ouvert parcontre il ne me di pas qu'il y a des erreur de syntaxe dans mon code donc je ne c'est pas d'ou vienne ces erreur

J'es essayer la mem chose avec Devc++ et c pareille

Peut etre que je n'es pas les bon fichier openGL dite moi ceux que vous utilisez merci
A voir également:

2 réponses

Wanou Messages postés 3 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 3 août 2006 1
3 août 2006 à 05:05
Merci Beaucoup ! ! ! j'es enfin réusi a compiler mon code sans probleme
1
mamiemando Messages postés 33134 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 mai 2024 7 756
3 août 2006 à 04:24
Une déclaration multiple survient au moment du linkage, c'est à dire au moment ou les modules compilés sont recollés de sorte à former un exécutable. Le problème c'est que par le biais des #include, tu peux avoir compiler une même section de code dans deux modules différents. Du coup, à la fin, tu obtiens une déclaration multiple.

Exemple

a.hpp
void f(){
  std::cout << "Je suis f :-)" << std::endl;
}

b.hpp
#include "a.hpp"

void g(){
  f();
}

main.hpp
#include "a.hpp"
#include "b.hpp"

int main(){
  f();
  g();
}

Quand on compile voici ce qu'il se passe :
* a ne dépend de personne et a.o (le module a compilé) contient le code de f. Jusque là tout va bien.
* b inclue a.hpp donc recopie le code concerné, celui de f(). b.o contient donc les fonctions f et g
* enfin on compile main.hpp, et là blam, on a deux fois f de définie, une fois dans a.hpp et une fois dans b.hpp, d'où multidéfinition...

Comment éviter le problème ?
=> Protéger le module pour que le hpp ne soit inclu qu'une fois :
plop.hpp
#ifndef PLOP
#define PLOP

//... code de plop.hpp ...

#endif

Autre point important faire attention (en particulier si des fonctions sont implémentées dans le .hpp) aux multidéfinitions de fonction, ie les fonctions dont le code à été copilé pour plusieurs .o. Supposons que a.hpp et b.hpp soient désormais protégés.
* a.o contiendra le code de f
* b.o contiendra le code de f et de g
* au cours des include du main le protype de f et g ne seront inclus qu'une fois, donc là tout va bien, opn n'a pas de multidéfinition. Par contre à la phase de linkage, f sera définie dans a.o et b.o d'ou une multi définition (!= déclaration multiple).

Pour régler le problème, soit on implémente f et g respectivement dans a.cpp et b.cpp, soit on les laisse dans les .hpp en les précédant du mot clé inline. Attention comme son nom l'indique ce mot clé est plutôt reservé au fonctions courtes car concrètement le compilateur remplace toutes les occurences de f() et de g() directement par leur code source.
#ifndef A_HPP
#define A_HPP

inline void f(){
  std::cout << "je suis une fonction inline" << std::endl;
}

#endif

Maintenant tu sais tout sur les déclarations (portotype) et définitions (code source) multiples ^^

Bonne chance
0