Bonjour à tous,
J'ouvre ce topic pour vous demander quelques précisions concernant l'utilisation de template en c++ avec des librairies dynamiques (dll). J'ai rencontré différents problèmes et je en sais pas si c'est un souci de configuration, de méconnaissance sur le language ou une limite technique (je suis novice en c++ ).
J'ai comme projet de faire un petit moteur de jeu c++. Celui-ci ce défini par une dll qui contient les classes de mon moteur (gestionnaire de ressource, gestionnaire d'événements, classe de base de sprite...) et j'ai un petit executable qui va utiliser et enrichir les bases du moteur pour ses besoin (spécialisation de sprite, regles pour le jeu etc...).
1) Premier cas : J'ai tenté de faire un service locator avec un template de façon à accèder à mes services comme j'ai l'habitude de le faire (je viens du monde C#).
J'avais donc une classe ServiceLocator qui contient un membre statique std::map<string, void*> avec 2 methodes statiques Register et GetService. Lorsque je l'utilisais dans mon executable, aucun soucis. Dans la DLL.... L'opérateur [] plantais avec un "violation access memory", j'ai donc changé par la création d'un std::pair puis de faire un insert. ça fonctionnais sauf que la, j'ai l'impression que ma map statique était instancié 2 fois ! (une fois dans l'exe, une fois dans la dll et je le voyait car le nombre d'éléments dans la map était différents). Pourtant l'exe utilise la dll, donc devrais être dans le même processus, je trouve ça bizarre... J'ai donc laissé tombé car ça me prennais la tête et fais autrement mais j'aimerais bien comprendre pourquoi et utiliser une façon plus générique de faire les choses...
2) Second cas : Je souhaitais utiliser LUA pour scripter le comportement de mon jeu de façon dynamique. Après quelques recherches, j'ai trouvé une librairie (luabind) qui me permet d'utiliser mes classes c++ dans mes scripts LUA. Cette librairie statique est incluse dans ma dll. Et là, même souffrance. Le code marche niquel dans l'exe mais dans la DLL ça plante avec une erreur R6010 (spécifique à LUA peut-être) au code c++ :
Encore une histoire de template semblerait...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 luabind::module(state) [ luabind::class_<MyClass>("MyClass") .def(luabind::constructor<int>()) .def("print", &MyClass::print)
Dans tout ça, j'ai l'impression que l'utilisation de template est réservé uniquement aux executables mais ça me gêne car j'aimerais encapsuler certains comportements et découpler la partie jeu (executable) de la partie métier (librairie). Je ne souhaite pas faire un gros executable de 50Mo et pouvoir découper mes parties comme j'aurais pu le faire en C# et j'aimeria spouvoir réutiliser mon moteur pour faire un editeur de niveau par exemple. Ma question est de savoir si mon approche est bonne en c++ et s'il est interdit d'utiliser les templates dans les librairies, si c'est mon compilateur vc++ 2013 qui est bugué ou si il y a quelque chose de particulier pour utiliser les templates dans les librairies...
Je trouve beaucoup de documentation sur les templates mais pas vraiment grand chose sur leur utilisation dans des librairies.
Merci par avance pour vos réponses
Partager