J'essaie de rendre ma bibliothèque exportable en tant que DLL mais je reçois beaucoup de ces avertissements pour une classe spécifique qui utilise std :: vector:
template <typename T>
class AGUI_CORE_DECLSPEC AguiEvent {
typedef void (*AguiCallbackFptr)(T arg, AguiWidget* sender);
std::vector<AguiCallbackFptr> events;
public:
void call(AguiWidget* sender, T arg) const;
void addHandler(AguiCallbackFptr proc);
void removeHandler(AguiCallbackFptr proc);
void removeHandler();
AguiEvent();
};
Je reçois des avertissements comme ceux-ci:
Avertissement 57 avertissement C4251: 'AguiEvent :: events': la classe 'std :: vector <_Ty>' doit avoir une interface dll pour être utilisée par les clients de la classe 'AguiEvent'
J'ai essayé de trouver comment le faire correctement, mais la documentation de MSDN est très Windows uniquement, et j'ai besoin que cela soit multiplateforme afin qu'il ne fasse que des choses spécifiques à MS lorsque AGUI_CORE_DECLSPEC est en fait défini.
Que dois-je faire pour me débarrasser de ces avertissements?
Merci
Exportation à partir d'un DLL est spécifique à la plate-forme. Vous devrez résoudre ce problème pour Windows (essentiellement utiliser declspec(dllexport/dllimport)
sur le modèle de classe instancié) et encapsulez le code requis dans votre macro de préprocesseur spécifique à Windows.
D'après mon expérience, l'exportation de classes STL à partir de DLL sous Windows est pénible, j'essaie généralement de concevoir l'interface de telle sorte que cela ne soit pas nécessaire.
Un correctif repose sur l'allocation/désallocation dynamique des structures STL. Donc:
class EXPORTED ExportedClass
{
private:
std::vector<int> *_integers;
public:
ExportedClass()
{
_integers = new std::vector<int>();
}
~ExportedClass()
{
delete _integers;
}
};
ne donnera aucun avertissement et il est plus sûr au cas où vous distribuez le même binaire (la dll) qui doit être utilisé avec une version différente du compilateur qui peut avoir différentes versions de la STL. De cette façon, vous avez la garantie à 100% que sizeof(ExportedClass)
est toujours la même.
Vous pouvez simplement exporter les membres auxquels les clients DLL doivent accéder. Pour ce faire, supprimez la déclaration d'exportation de la déclaration de classe et ajoutez-la à chaque fonction membre individuelle que vous souhaitez exporter.
MODIFIER:
Dans votre cas, vous ne devriez probablement pas essayer d'exporter la classe (omettez AGUI_CORE_DECLSPEC) car il s'agit d'une classe modèle. Fournissez toutes les méthodes dans votre en-tête en ligne et cela fonctionnera.
Si vous ne le souhaitez pas, certains compilateurs offrent un moyen spécial d'exporter des classes de modèles. Mais vous devrez spécifier le paramètre de modèle pour cela.
La méthode habituelle pour traiter des choses spécifiques à la plate-forme comme celle-ci consiste à essayer de restreindre tous les paramètres spécifiques à la plate-forme à une poignée de fichiers/classes de bas niveau, puis à utiliser #defines et # ifdef/# ifndef directives de préprocesseur pour ajouter/remplacer des variations spécifiques à la plate-forme .
Pour l'implémenter efficacement, vous pourriez avoir besoin d'une couche d'abstraction. Par exemple, un système de production sur lequel j'ai travaillé dans les années 90 avait une bibliothèque "File System". Cela présentait une interface commune aux applications et au code de production, mais devait s'appuyer sur quelques fichiers spécifiques à la plate-forme. En plus de faciliter la compilation et la maintenance, il a également facilité le portage vers de nouvelles plates-formes. Un nouveau fournisseur de matériel de fichiers ou une nouvelle version du système d'exploitation? Ajoutez simplement les paramètres aux fichiers d'inclusion et ajoutez de nouvelles directives en conséquence.