Maison  >  Article  >  développement back-end  >  Comment exporter des classes contenant des objets std :: à partir d'une DLL ?

Comment exporter des classes contenant des objets std :: à partir d'une DLL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-16 18:52:03589parcourir

How to Export Classes Containing std:: Objects from a DLL?

Exportation de classes contenant std :: objets à partir d'une DLL

Lors de l'exportation de classes contenant des objets comme std :: vecteurs et std :: chaînes depuis une DLL, un avertissement, tel que "class 'std::map<_Kty,_Ty>' nécessite une interface DLL pour être utilisée par les clients de la classe 'FontManager'", peut survenir. Cet avertissement indique que les types de membres de la classe nécessitent qu'une interface DLL soit accessible par le code client.

Déclaration avancée des conteneurs standard

Pour résoudre ce problème, transférez les déclarations de classe avec DLL_EXPORT peuvent être placées avant les variables membres, comme indiqué ci-dessous :

template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>;
template class DLL_EXPORT std::vector<tCharGlyphProviderRef,std::allocator<tCharGlyphProviderRef> >;
std::vector<tCharGlyphProviderRef> m_glyphProviders;

Bien que cette approche puisse supprimer les avertissements, elle ne garantit pas la disponibilité de l'interface DLL pour les fonctions membres.

Exigences de l'interface DLL

Pour garantir une fonctionnalité DLL appropriée, les classes et leurs fonctions membres doivent avoir une interface DLL. Cela signifie que le compilateur génère la fonction dans la DLL elle-même, la rendant importable. Le fait de ne pas fournir cette interface pour les membres accessibles par le code client entraînera des avertissements ou des erreurs lors de la compilation ou de la liaison.

Membres privés et avertissements

Membres privés non accessibles aux clients peut être exempté des déclarations DLL_EXPORT. Les avertissements pour ces membres peuvent être désactivés. Cependant, des précautions doivent être prises pour les destructeurs et les constructeurs générés par le compilateur.

Gestion des membres exportables par Dll

Les membres qui doivent être utilisés par les clients nécessitent soit :

  • Dll-Export Wrappers : Créez des fonctions de substitution exportées à partir de la DLL qui effectuent des opérations sur le membre.
  • Méthodes d'indirection : Implémentez des méthodes qui fournissent indirection vers le membre, en exportant ces méthodes à la place.
  • Idiome PIMPL : Utilisez l'idiome de mise en œuvre privée (PIMPL) pour réduire la visibilité externe des membres.

Instanciation des classes de modèles

Les déclarations directes des classes de modèles avec DLL_EXPORT créent uniquement des instanciations dans l'unité de compilation actuelle. Cette approche est insuffisante pour les classes sans modèle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn